From 296b2de240d9c8f464b2467143dc7cc24f99d8d8 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 01/15] Drop RCT_EXPORT_METHOD from RCTClipboard TurboModule (#57671) Summary: Changelog: [Internal] `RCTClipboard` is a TurboModule: it conforms to `NativeClipboardSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeClipboardSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113568495 --- packages/react-native/React/CoreModules/RCTClipboard.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTClipboard.mm b/packages/react-native/React/CoreModules/RCTClipboard.mm index f057c34f704c..ab5aea968ff7 100644 --- a/packages/react-native/React/CoreModules/RCTClipboard.mm +++ b/packages/react-native/React/CoreModules/RCTClipboard.mm @@ -26,7 +26,7 @@ - (dispatch_queue_t)methodQueue return dispatch_get_main_queue(); } -RCT_EXPORT_METHOD(setString : (NSString *)content) +- (void)setString:(NSString *)content { #if !TARGET_OS_TV UIPasteboard *clipboard = [UIPasteboard generalPasteboard]; @@ -34,7 +34,7 @@ - (dispatch_queue_t)methodQueue #endif } -RCT_EXPORT_METHOD(getString : (RCTPromiseResolveBlock)resolve reject : (__unused RCTPromiseRejectBlock)reject) +- (void)getString:(RCTPromiseResolveBlock)resolve reject:(__unused RCTPromiseRejectBlock)reject { #if !TARGET_OS_TV UIPasteboard *clipboard = [UIPasteboard generalPasteboard]; From b1d48d3c2289e0dd3315ee6a03a8cac70d89a9e2 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 02/15] Drop RCT_EXPORT_METHOD from RCTAccessibilityManager TurboModule Summary: Changelog: [Internal] `RCTAccessibilityManager` is a TurboModule: it conforms to `NativeAccessibilityManagerSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeAccessibilityManagerSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579886 --- .../CoreModules/RCTAccessibilityManager.mm | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTAccessibilityManager.mm b/packages/react-native/React/CoreModules/RCTAccessibilityManager.mm index 19895271f141..29b03e6c1c79 100644 --- a/packages/react-native/React/CoreModules/RCTAccessibilityManager.mm +++ b/packages/react-native/React/CoreModules/RCTAccessibilityManager.mm @@ -274,9 +274,8 @@ - (void)setMultipliers:(NSDictionary *)multipliers return _multipliers; } -RCT_EXPORT_METHOD( - setAccessibilityContentSizeMultipliers : ( - JS::NativeAccessibilityManager::SpecSetAccessibilityContentSizeMultipliersJSMultipliers &)JSMultipliers) +- (void)setAccessibilityContentSizeMultipliers: + (JS::NativeAccessibilityManager::SpecSetAccessibilityContentSizeMultipliersJSMultipliers &)JSMultipliers { NSMutableDictionary *multipliers = [NSMutableDictionary new]; setMultipliers(multipliers, UIContentSizeCategoryExtraSmall, JSMultipliers.extraSmall()); @@ -308,7 +307,7 @@ static void setMultipliers( } } -RCT_EXPORT_METHOD(setAccessibilityFocus : (double)reactTag) +- (void)setAccessibilityFocus:(double)reactTag { dispatch_async(dispatch_get_main_queue(), ^{ UIView *view = [self.viewRegistry_DEPRECATED viewForReactTag:@(reactTag)]; @@ -316,14 +315,16 @@ static void setMultipliers( }); } -RCT_EXPORT_METHOD(announceForAccessibility : (NSString *)announcement) +- (void)announceForAccessibility:(NSString *)announcement { UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, announcement); } -RCT_EXPORT_METHOD( - announceForAccessibilityWithOptions : (NSString *)announcement options : ( - JS::NativeAccessibilityManager::SpecAnnounceForAccessibilityWithOptionsOptions &)options) +- (void) + announceForAccessibilityWithOptions:(NSString *)announcement + options: + (JS::NativeAccessibilityManager::SpecAnnounceForAccessibilityWithOptionsOptions &) + options { NSMutableDictionary *attrsDictionary = [NSMutableDictionary new]; if (options.queue()) { @@ -356,47 +357,41 @@ static void setMultipliers( } } -RCT_EXPORT_METHOD(getMultiplier : (RCTResponseSenderBlock)callback) +- (void)getMultiplier:(RCTResponseSenderBlock)callback { if (callback) { callback(@[ @(self.multiplier) ]); } } -RCT_EXPORT_METHOD( - getCurrentBoldTextState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentBoldTextState:(RCTResponseSenderBlock)onSuccess onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isBoldTextEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentGrayscaleState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentGrayscaleState:(RCTResponseSenderBlock)onSuccess onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isGrayscaleEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentInvertColorsState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentInvertColorsState:(RCTResponseSenderBlock)onSuccess onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isInvertColorsEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentReduceMotionState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentReduceMotionState:(RCTResponseSenderBlock)onSuccess onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isReduceMotionEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentDarkerSystemColorsState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock) - onError) +- (void)getCurrentDarkerSystemColorsState:(RCTResponseSenderBlock)onSuccess + onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isDarkerSystemColorsEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentPrefersCrossFadeTransitionsState : (RCTResponseSenderBlock) - onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentPrefersCrossFadeTransitionsState:(RCTResponseSenderBlock)onSuccess + onError:(__unused RCTResponseSenderBlock)onError { if (@available(iOS 14.0, *)) { onSuccess(@[ @(UIAccessibilityPrefersCrossFadeTransitions()) ]); @@ -405,15 +400,13 @@ static void setMultipliers( } } -RCT_EXPORT_METHOD( - getCurrentReduceTransparencyState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock) - onError) +- (void)getCurrentReduceTransparencyState:(RCTResponseSenderBlock)onSuccess + onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isReduceTransparencyEnabled) ]); } -RCT_EXPORT_METHOD( - getCurrentVoiceOverState : (RCTResponseSenderBlock)onSuccess onError : (__unused RCTResponseSenderBlock)onError) +- (void)getCurrentVoiceOverState:(RCTResponseSenderBlock)onSuccess onError:(__unused RCTResponseSenderBlock)onError { onSuccess(@[ @(_isVoiceOverEnabled) ]); } From ccbb95cc2dd6cba7aa2da6e42ee254c6bc1f9078 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 03/15] Drop RCT_EXPORT_METHOD from RCTActionSheetManager TurboModule (#57673) Summary: Changelog: [Internal] `RCTActionSheetManager` is a TurboModule: it conforms to `NativeActionSheetManagerSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeActionSheetManagerSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579871 --- .../React/CoreModules/RCTActionSheetManager.mm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTActionSheetManager.mm b/packages/react-native/React/CoreModules/RCTActionSheetManager.mm index 360b366ccc3e..41150ac877b0 100644 --- a/packages/react-native/React/CoreModules/RCTActionSheetManager.mm +++ b/packages/react-native/React/CoreModules/RCTActionSheetManager.mm @@ -76,9 +76,8 @@ - (void)presentViewController:(UIViewController *)alertController [parentViewController presentViewController:alertController animated:YES completion:nil]; } -RCT_EXPORT_METHOD( - showActionSheetWithOptions : (JS::NativeActionSheetManager::SpecShowActionSheetWithOptionsOptions &) - options callback : (RCTResponseSenderBlock)callback) +- (void)showActionSheetWithOptions:(JS::NativeActionSheetManager::SpecShowActionSheetWithOptionsOptions &)options + callback:(RCTResponseSenderBlock)callback { if (RCTRunningInAppExtension()) { RCTLogError(@"Unable to show action sheet from app extension"); @@ -219,7 +218,7 @@ - (void)presentViewController:(UIViewController *)alertController }); } -RCT_EXPORT_METHOD(dismissActionSheet) +- (void)dismissActionSheet { if (_alertControllers.count == 0) { RCTLogWarn(@"Unable to dismiss action sheet"); @@ -232,10 +231,10 @@ - (void)presentViewController:(UIViewController *)alertController }); } -RCT_EXPORT_METHOD( - showShareActionSheetWithOptions : (JS::NativeActionSheetManager::SpecShowShareActionSheetWithOptionsOptions &) - options failureCallback : (RCTResponseSenderBlock)failureCallback successCallback : (RCTResponseSenderBlock) - successCallback) +- (void)showShareActionSheetWithOptions: + (JS::NativeActionSheetManager::SpecShowShareActionSheetWithOptionsOptions &)options + failureCallback:(RCTResponseSenderBlock)failureCallback + successCallback:(RCTResponseSenderBlock)successCallback { if (RCTRunningInAppExtension()) { RCTLogError(@"Unable to show action sheet from app extension"); From 8a20546e033b984f944bdbb830b97fa696707543 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 04/15] Drop RCT_EXPORT_METHOD from RCTAlertManager TurboModule (#57675) Summary: Changelog: [Internal] `RCTAlertManager` is a TurboModule: it conforms to `NativeAlertManagerSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeAlertManagerSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579876 --- packages/react-native/React/CoreModules/RCTAlertManager.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/React/CoreModules/RCTAlertManager.mm b/packages/react-native/React/CoreModules/RCTAlertManager.mm index 8dbe57b90ba3..2d9e8290807b 100644 --- a/packages/react-native/React/CoreModules/RCTAlertManager.mm +++ b/packages/react-native/React/CoreModules/RCTAlertManager.mm @@ -65,7 +65,7 @@ - (void)invalidate * The key from the `buttons` dictionary is passed back in the callback on click. * Buttons are displayed in the order they are specified. */ -RCT_EXPORT_METHOD(alertWithArgs : (JS::NativeAlertManager::Args &)args callback : (RCTResponseSenderBlock)callback) +- (void)alertWithArgs:(JS::NativeAlertManager::Args &)args callback:(RCTResponseSenderBlock)callback { NSString *title = [RCTConvert NSString:args.title()]; NSString *message = [RCTConvert NSString:args.message()]; From 216b16ee21a69846183de1b00d3b740f79f922ca Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 05/15] Drop RCT_EXPORT_METHOD from RCTAppState TurboModule (#57676) Summary: Changelog: [Internal] `RCTAppState` is a TurboModule: it conforms to `NativeAppStateSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeAppStateSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579877 --- packages/react-native/React/CoreModules/RCTAppState.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/React/CoreModules/RCTAppState.mm b/packages/react-native/React/CoreModules/RCTAppState.mm index d504c525bb9d..7ca35bfefefd 100644 --- a/packages/react-native/React/CoreModules/RCTAppState.mm +++ b/packages/react-native/React/CoreModules/RCTAppState.mm @@ -135,7 +135,7 @@ - (void)handleAppStateDidChange:(NSNotification *)notification /** * Get the current background/foreground state of the app */ -RCT_EXPORT_METHOD(getCurrentAppState : (RCTResponseSenderBlock)callback error : (__unused RCTResponseSenderBlock)error) +- (void)getCurrentAppState:(RCTResponseSenderBlock)callback error:(__unused RCTResponseSenderBlock)error { callback(@[ @{@"app_state" : RCTCurrentAppState()} ]); } From 081a62109ffd00d196a4383220a9f12da97f156d Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 06/15] Drop RCT_EXPORT_METHOD from RCTAppearance TurboModule (#57679) Summary: Changelog: [Internal] `RCTAppearance` is a TurboModule: it conforms to `NativeAppearanceSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeAppearanceSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579869 --- packages/react-native/React/CoreModules/RCTAppearance.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/React/CoreModules/RCTAppearance.mm b/packages/react-native/React/CoreModules/RCTAppearance.mm index d25d9f64e6bd..76df5b10ac2a 100644 --- a/packages/react-native/React/CoreModules/RCTAppearance.mm +++ b/packages/react-native/React/CoreModules/RCTAppearance.mm @@ -109,7 +109,7 @@ - (dispatch_queue_t)methodQueue return std::make_shared(params); } -RCT_EXPORT_METHOD(setColorScheme : (NSString *)style) +- (void)setColorScheme:(NSString *)style { UIUserInterfaceStyle userInterfaceStyle = [RCTConvert UIUserInterfaceStyle:style]; NSMutableArray *windows = [NSMutableArray new]; From 8878ddd0be7c2d776f7be1e64f22ae9c443cf75e Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 07/15] Drop RCT_EXPORT_METHOD from RCTDevLoadingView TurboModule (#57680) Summary: Changelog: [Internal] `RCTDevLoadingView` is a TurboModule: it conforms to `NativeDevLoadingViewSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeDevLoadingViewSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579873 --- .../react-native/React/CoreModules/RCTDevLoadingView.mm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm index 3475fa39350c..1ae546d91fe7 100644 --- a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm +++ b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm @@ -244,16 +244,17 @@ - (void)showMessage:(NSString *)message }); } -RCT_EXPORT_METHOD( - showMessage : (NSString *)message withColor : (NSNumber *__nonnull)color withBackgroundColor : (NSNumber *__nonnull) - backgroundColor withDismissButton : (NSNumber *)dismissButton) +- (void)showMessage:(NSString *)message + withColor:(NSNumber *__nonnull)color + withBackgroundColor:(NSNumber *__nonnull)backgroundColor + withDismissButton:(NSNumber *)dismissButton { [self showMessage:message color:[RCTConvert UIColor:color] backgroundColor:[RCTConvert UIColor:backgroundColor] dismissButton:[dismissButton boolValue]]; } -RCT_EXPORT_METHOD(hide) +- (void)hide { if (!RCTDevLoadingViewGetEnabled()) { return; From d17c14b2d7b42a9d46ab4ede1f9640fc8e7e82b8 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 08/15] Drop RCT_EXPORT_METHOD from RCTDevMenu TurboModule (#57681) Summary: Changelog: [Internal] `RCTDevMenu` is a TurboModule: it conforms to `NativeDevMenuSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeDevMenuSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579872 --- packages/react-native/React/CoreModules/RCTDevMenu.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTDevMenu.mm b/packages/react-native/React/CoreModules/RCTDevMenu.mm index 890c1596df74..883b4ba7f8e1 100644 --- a/packages/react-native/React/CoreModules/RCTDevMenu.mm +++ b/packages/react-native/React/CoreModules/RCTDevMenu.mm @@ -430,7 +430,7 @@ - (void)setDefaultJSBundle return items; } -RCT_EXPORT_METHOD(show) +- (void)show { if ((_actionSheet != nullptr) || RCTRunningInAppExtension() || !_devMenuEnabled) { return; @@ -495,13 +495,13 @@ - (BOOL)shakeToShow return ((RCTDevSettings *)[_moduleRegistry moduleForName:"DevSettings"]).isShakeToShowDevMenuEnabled; } -RCT_EXPORT_METHOD(reload) +- (void)reload { WARN_DEPRECATED_DEV_MENU_EXPORT(); RCTTriggerReloadCommandListeners(@"Unknown from JS"); } -RCT_EXPORT_METHOD(setProfilingEnabled : (BOOL)enabled) +- (void)setProfilingEnabled:(BOOL)enabled { WARN_DEPRECATED_DEV_MENU_EXPORT(); ((RCTDevSettings *)[_moduleRegistry moduleForName:"DevSettings"]).isProfilingEnabled = enabled; @@ -512,7 +512,7 @@ - (BOOL)profilingEnabled return ((RCTDevSettings *)[_moduleRegistry moduleForName:"DevSettings"]).isProfilingEnabled; } -RCT_EXPORT_METHOD(setHotLoadingEnabled : (BOOL)enabled) +- (void)setHotLoadingEnabled:(BOOL)enabled { WARN_DEPRECATED_DEV_MENU_EXPORT(); ((RCTDevSettings *)[_moduleRegistry moduleForName:"DevSettings"]).isHotLoadingEnabled = enabled; From 1b13d3fbbea20867af59a8704f3ad31357075327 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 09/15] Drop RCT_EXPORT_METHOD from RCTDevSettings TurboModule (#57682) Summary: Changelog: [Internal] `RCTDevSettings` is a TurboModule: it conforms to `NativeDevSettingsSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeDevSettingsSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579870 --- .../React/CoreModules/RCTDevSettings.mm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTDevSettings.mm b/packages/react-native/React/CoreModules/RCTDevSettings.mm index cc4cb1c74e52..0698f4a93fb7 100644 --- a/packages/react-native/React/CoreModules/RCTDevSettings.mm +++ b/packages/react-native/React/CoreModules/RCTDevSettings.mm @@ -313,22 +313,22 @@ - (BOOL)isHotLoadingAvailable return NO; } -RCT_EXPORT_METHOD(reload) +- (void)reload { RCTTriggerReloadCommandListeners(@"Unknown From JS"); } -RCT_EXPORT_METHOD(reloadWithReason : (NSString *)reason) +- (void)reloadWithReason:(NSString *)reason { RCTTriggerReloadCommandListeners(reason); } -RCT_EXPORT_METHOD(onFastRefresh) +- (void)onFastRefresh { [self.bridge onFastRefresh]; } -RCT_EXPORT_METHOD(setIsShakeToShowDevMenuEnabled : (BOOL)enabled) +- (void)setIsShakeToShowDevMenuEnabled:(BOOL)enabled { [self _updateSettingWithValue:@(enabled) forKey:kRCTDevSettingShakeToShowDevMenu]; } @@ -338,7 +338,7 @@ - (BOOL)isShakeToShowDevMenuEnabled return _isShakeGestureEnabled && [[self settingForKey:kRCTDevSettingShakeToShowDevMenu] boolValue]; } -RCT_EXPORT_METHOD(setProfilingEnabled : (BOOL)enabled) +- (void)setProfilingEnabled:(BOOL)enabled { [self _updateSettingWithValue:@(enabled) forKey:kRCTDevSettingProfilingEnabled]; [self _profilingSettingDidChange]; @@ -368,7 +368,7 @@ - (void)_profilingSettingDidChange } } -RCT_EXPORT_METHOD(setHotLoadingEnabled : (BOOL)enabled) +- (void)setHotLoadingEnabled:(BOOL)enabled { if (self.isHotLoadingEnabled != enabled) { [self _updateSettingWithValue:@(enabled) forKey:kRCTDevSettingHotLoadingEnabled]; @@ -390,7 +390,7 @@ - (BOOL)isHotLoadingEnabled return [[self settingForKey:kRCTDevSettingHotLoadingEnabled] boolValue]; } -RCT_EXPORT_METHOD(toggleElementInspector) +- (void)toggleElementInspector { BOOL value = [[self settingForKey:kRCTDevSettingIsInspectorShown] boolValue]; [self _updateSettingWithValue:@(!value) forKey:kRCTDevSettingIsInspectorShown]; @@ -403,7 +403,7 @@ - (BOOL)isHotLoadingEnabled } } -RCT_EXPORT_METHOD(addMenuItem : (NSString *)title) +- (void)addMenuItem:(NSString *)title { __weak __typeof(self) weakSelf = self; [(RCTDevMenu *)[self.moduleRegistry moduleForName:"DevMenu"] @@ -494,7 +494,7 @@ - (void)setupHMRClientWithAdditionalBundleURL:(NSURL *)bundleURL } } -RCT_EXPORT_METHOD(openDebugger) +- (void)openDebugger { #if RCT_ENABLE_INSPECTOR [RCTInspectorDevServerHelper From c0b06dba77b9880da497fac95115587390b15d7b Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 10/15] Drop RCT_EXPORT_METHOD from RCTDevToolsRuntimeSettingsModule TurboModule (#57683) Summary: Changelog: [Internal] `RCTDevToolsRuntimeSettingsModule` is a TurboModule: it conforms to `NativeReactDevToolsRuntimeSettingsModuleSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeReactDevToolsRuntimeSettingsModuleSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579881 --- .../React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm b/packages/react-native/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm index ba4e2559697a..5b5a986da14b 100644 --- a/packages/react-native/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm +++ b/packages/react-native/React/CoreModules/RCTDevToolsRuntimeSettingsModule.mm @@ -25,8 +25,7 @@ @interface RCTDevToolsRuntimeSettingsModule () Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 11/15] Drop RCT_EXPORT_METHOD from RCTExceptionsManager TurboModule (#57684) Summary: Changelog: [Internal] `RCTExceptionsManager` is a TurboModule: it conforms to `NativeExceptionsManagerSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeExceptionsManagerSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579875 --- .../React/CoreModules/RCTExceptionsManager.mm | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTExceptionsManager.mm b/packages/react-native/React/CoreModules/RCTExceptionsManager.mm index cdaae3aee7f8..9b3b56c3371a 100644 --- a/packages/react-native/React/CoreModules/RCTExceptionsManager.mm +++ b/packages/react-native/React/CoreModules/RCTExceptionsManager.mm @@ -87,24 +87,22 @@ - (void)reportFatal:(NSString *)message } // TODO(T205456329): This method is deprecated in favour of reportException. Delete in v0.77 -RCT_EXPORT_METHOD( - reportSoftException : (NSString *)message stack : (NSArray *)stack exceptionId : (double) - exceptionId) +- (void)reportSoftException:(NSString *)message stack:(NSArray *)stack exceptionId:(double)exceptionId { [self reportSoft:message stack:stack exceptionId:exceptionId extraDataAsJSON:nil]; } // TODO(T205456329): This method is deprecated in favour of reportException. Delete in v0.77 -RCT_EXPORT_METHOD( - reportFatalException : (NSString *)message stack : (NSArray *)stack exceptionId : (double) - exceptionId) +- (void)reportFatalException:(NSString *)message stack:(NSArray *)stack exceptionId:(double)exceptionId { [self reportFatal:message stack:stack exceptionId:exceptionId extraDataAsJSON:nil]; } -RCT_EXPORT_METHOD(dismissRedbox) {} +- (void)dismissRedbox +{ +} -RCT_EXPORT_METHOD(reportException : (JS::NativeExceptionsManager::ExceptionData &)data) +- (void)reportException:(JS::NativeExceptionsManager::ExceptionData &)data { NSMutableDictionary *mutableErrorData = [NSMutableDictionary new]; mutableErrorData[@"message"] = data.message(); From e702fdaeff4679357087b3573d10bc4be9a0d619 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 12/15] Drop RCT_EXPORT_METHOD from RCTI18nManager TurboModule (#57685) Summary: Changelog: [Internal] `RCTI18nManager` is a TurboModule: it conforms to `NativeI18nManagerSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeI18nManagerSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579882 --- packages/react-native/React/CoreModules/RCTI18nManager.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTI18nManager.mm b/packages/react-native/React/CoreModules/RCTI18nManager.mm index 7d3b9eaa11cf..e24c2e60ff64 100644 --- a/packages/react-native/React/CoreModules/RCTI18nManager.mm +++ b/packages/react-native/React/CoreModules/RCTI18nManager.mm @@ -26,17 +26,17 @@ + (BOOL)requiresMainQueueSetup return NO; } -RCT_EXPORT_METHOD(allowRTL : (BOOL)value) +- (void)allowRTL:(BOOL)value { [[RCTI18nUtil sharedInstance] allowRTL:value]; } -RCT_EXPORT_METHOD(forceRTL : (BOOL)value) +- (void)forceRTL:(BOOL)value { [[RCTI18nUtil sharedInstance] forceRTL:value]; } -RCT_EXPORT_METHOD(swapLeftAndRightInRTL : (BOOL)value) +- (void)swapLeftAndRightInRTL:(BOOL)value { [[RCTI18nUtil sharedInstance] swapLeftAndRightInRTL:value]; } From 2f0632fd30f9f4ebc39d2f7c786f2266bb9d8524 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 13/15] Drop RCT_EXPORT_METHOD from RCTLogBox TurboModule (#57677) Summary: Changelog: [Internal] `RCTLogBox` is a TurboModule: it conforms to `NativeLogBoxSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeLogBoxSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579879 --- packages/react-native/React/CoreModules/RCTLogBox.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTLogBox.mm b/packages/react-native/React/CoreModules/RCTLogBox.mm index d9663afb29c4..7e8be47170dd 100644 --- a/packages/react-native/React/CoreModules/RCTLogBox.mm +++ b/packages/react-native/React/CoreModules/RCTLogBox.mm @@ -39,7 +39,7 @@ - (void)setSurfacePresenter:(id)surfacePresenter _bridgelessSurfacePresenter = surfacePresenter; } -RCT_EXPORT_METHOD(show) +- (void)show { if (RCTRedBoxGetEnabled()) { __weak RCTLogBox *weakSelf = self; @@ -63,7 +63,7 @@ - (void)setSurfacePresenter:(id)surfacePresenter } } -RCT_EXPORT_METHOD(hide) +- (void)hide { if (RCTRedBoxGetEnabled()) { __weak RCTLogBox *weakSelf = self; From db5892b14db3b8b03ea9b46936b8d4f2661b4031 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 14/15] Drop RCT_EXPORT_METHOD from RCTRedBox TurboModule (#57678) Summary: Changelog: [Internal] `RCTRedBox` is a TurboModule: it conforms to `NativeRedBoxSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeRedBoxSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579880 --- packages/react-native/React/CoreModules/RCTRedBox.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTRedBox.mm b/packages/react-native/React/CoreModules/RCTRedBox.mm index 91a9878ddb1a..f2edecee813d 100644 --- a/packages/react-native/React/CoreModules/RCTRedBox.mm +++ b/packages/react-native/React/CoreModules/RCTRedBox.mm @@ -222,12 +222,12 @@ - (void)loadExtraDataViewController }); } -RCT_EXPORT_METHOD(setExtraData : (NSDictionary *)extraData forIdentifier : (NSString *)identifier) +- (void)setExtraData:(NSDictionary *)extraData forIdentifier:(NSString *)identifier { [_extraDataViewController addExtraData:extraData forIdentifier:identifier]; } -RCT_EXPORT_METHOD(dismiss) +- (void)dismiss { dispatch_async(dispatch_get_main_queue(), ^{ [self->_controller dismiss]; From 8ba92991b5a160c27c2be5fe107e0609f07988d7 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 24 Jul 2026 18:36:59 -0700 Subject: [PATCH 15/15] Drop RCT_EXPORT_METHOD from RCTStatusBarManager TurboModule (#57686) Summary: Changelog: [Internal] `RCTStatusBarManager` is a TurboModule: it conforms to `NativeStatusBarManagerIOSSpec` and implements `getTurboModule:` returning the codegen'd `...SpecJSI`. For TurboModules, the JS->ObjC dispatch is driven by codegen (the generated spec supplies the `selector` and argument kinds, invoked at runtime via `NSMethodSignature` / `NSInvocation`), not by the `RCT_EXPORT_METHOD` macro's `__rct_export__` metadata. The exported methods here are async-void with concrete parameter types (no generic `id` requiring `RCTConvert` coercion), so the macro is not functionally required. Convert them to plain ObjC method declarations; conformance to the codegen'd `NativeStatusBarManagerIOSSpec` protocol keeps compiler-enforced signature parity. Signature-only refactor with no change to the JS-facing API. Sync methods, methods with `id` params, and `constantsToExport` are intentionally left untouched. Differential Revision: D113579878 --- .../CoreModules/PlatformStubs/RCTStatusBarManager.mm | 12 +++++++++--- .../React/CoreModules/RCTStatusBarManager.mm | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm b/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm index 1c4b20114128..12c27619f250 100644 --- a/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm +++ b/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm @@ -17,11 +17,17 @@ @implementation RCTStatusBarManager RCT_EXPORT_MODULE() -RCT_EXPORT_METHOD(getHeight : (RCTResponseSenderBlock)callback) {} +- (void)getHeight:(RCTResponseSenderBlock)callback +{ +} -RCT_EXPORT_METHOD(setStyle : (NSString *)style animated : (BOOL)animated) {} +- (void)setStyle:(NSString *)style animated:(BOOL)animated +{ +} -RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (NSString *)withAnimation) {} +- (void)setHidden:(BOOL)hidden withAnimation:(NSString *)withAnimation +{ +} - (facebook::react::ModuleConstants)getConstants { diff --git a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm index d81528189014..dc0a6568251d 100644 --- a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm +++ b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm @@ -136,14 +136,14 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification [self emitEvent:kStatusBarFrameWillChange forNotification:notification]; } -RCT_EXPORT_METHOD(getHeight : (RCTResponseSenderBlock)callback) +- (void)getHeight:(RCTResponseSenderBlock)callback { callback(@[ @{ @"height" : @(RCTUIStatusBarManager().statusBarFrame.size.height), } ]); } -RCT_EXPORT_METHOD(setStyle : (NSString *)style animated : (BOOL)animated) +- (void)setStyle:(NSString *)style animated:(BOOL)animated { dispatch_async(dispatch_get_main_queue(), ^{ UIStatusBarStyle statusBarStyle = [RCTConvert UIStatusBarStyle:style]; @@ -159,7 +159,7 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification }); } -RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (NSString *)withAnimation) +- (void)setHidden:(BOOL)hidden withAnimation:(NSString *)withAnimation { dispatch_async(dispatch_get_main_queue(), ^{ UIStatusBarAnimation animation = [RCTConvert UIStatusBarAnimation:withAnimation];