Skip to content

RN 0.85.0 + iOS 26 crashes on root component swap - RCTFatal in TurboModule queue #57014

@charleyms

Description

@charleyms

Description

Using React Native 0.85.0 on iOS 26.5. App launches successfully and initial screen renders correctly. Any setState that swaps the root component causes immediate native crash that bypasses ErrorBoundary.

The crash happens on com.meta.react.turbomodulemanager.queue with RCTFatal → objc_exception_rethrow → abort.

Bundle is Hermes bytecode v98. Tested on iPhone 15 Pro and iPhone 16 Pro - both crash identically.

Steps to reproduce

  1. Create RN 0.85.0 app with custom state-based navigation (no @react-navigation libraries)
  2. Render initial screen via useState
  3. Trigger setState to swap to different screen component
  4. App crashes natively

React Native Version

0.85.0

Affected Platforms

Runtime - iOS

Output of npx @react-native-community/cli info

info Fetching system and libraries information...
System:
  OS: macOS 26.4.1
  CPU: (6) arm64 Apple A18 Pro
  Memory: 112.33 MB / 8.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 25.9.0
    path: /opt/homebrew/bin/node
  Yarn: Not Found
  npm:
    version: 11.12.1
    path: /opt/homebrew/bin/npm
  Watchman: Not Found
Managers:
  CocoaPods:
    version: 1.16.2
    path: /opt/homebrew/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.5
      - iOS 26.5
      - macOS 26.5
      - tvOS 26.5
      - visionOS 26.5
      - watchOS 26.5
  Android SDK: Not Found
IDEs:
  Android Studio: 2025.3 AI-253.31033.145.2533.15113396
  Xcode:
    version: 26.5/17F42
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 21.0.10
    path: /usr/bin/javac
  Ruby:
    version: 2.6.10
    path: /usr/bin/ruby
npmPackages:
  "@react-native-community/cli":
    installed: 20.1.3
    wanted: ^20.1.3
  react:
    installed: 19.2.6
    wanted: ^19.2.3
  react-native:
    installed: 0.85.3
    wanted: ^0.85.0
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: Not found
  newArchEnabled: true

Stacktrace or Logs

Last Exception Backtrace:
0   CoreFoundation                	0x1a0fba23c __exceptionPreprocess + 164
1   libobjc.A.dylib               	0x19da89224 objc_exception_throw + 88
2   React                         	0x1021337dc RCTFatal + 568
3   React                         	0x1023a3924 -[RCTExceptionsManager reportFatal:stack:exceptionId:extraDataAsJSON:] + 512
4   React                         	0x1023a4360 -[RCTExceptionsManager reportException:] + 2292
5   CoreFoundation                	0x1a0f088f4 __invoking___ + 148
6   CoreFoundation                	0x1a0f08778 -[NSInvocation invoke] + 424
7   CoreFoundation                	0x1a0f1e428 -[NSInvocation invokeWithTarget:] + 64
8   React                         	0x1023b88b8 invocation function for block in facebook::react::ObjCTurboModule::performVoidMethodInvocation

Thread 1 Crashed:
0   libsystem_kernel.dylib        	__pthread_kill + 8
1   libsystem_pthread.dylib       	pthread_kill + 268
2   libsystem_c.dylib             	abort + 148
3   libc++abi.dylib               	__abort_message + 132
4   libc++abi.dylib               	demangling_terminate_handler() + 296
5   libobjc.A.dylib               	_objc_terminate() + 156
6   libc++abi.dylib               	std::__terminate(void (*)()) + 16
7   libc++abi.dylib               	__cxa_rethrow + 188
8   libobjc.A.dylib               	objc_exception_rethrow + 44
9   React                         	performVoidMethodInvocation + 128

Crash happens on com.meta.react.turbomodulemanager.queue when state changes cause root component swap. ErrorBoundary doesn't catch it. iOS 26.5, RN 0.85.0, Hermes bytecode v98.

MANDATORY Reproducer

Minimal reproducer: ```javascript import React, { useState } from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; function ScreenA({ onNavigate }) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> Screen A <TouchableOpacity onPress={() => onNavigate('B')}> Go to Screen B ); } function ScreenB() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> Screen B ); } export default function App() { const [screen, setScreen] = useState('A'); if (screen === 'A') return ; return ; }

Screenshots and Videos

  • Removed all @react-navigation packages
  • Removed react-native-screens, gesture-handler, safe-area-context
  • Updated AsyncStorage to v2
  • Wrapped navigation in setTimeout (100ms deferral)
  • ErrorBoundary class component
  • Updated all @react-native/* packages to 0.85.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs: Author FeedbackNeeds: ReproThis issue could be improved with a clear list of steps to reproduce the issue.Platform: iOSiOS applications.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions