[RCTBatchedBridge perfStats]:发送到实例的无法识别的选择器
[RCTBatchedBridge perfStats]: unrecognized selector sent to instance
全部。
当我在现有 iOS 应用程序中使用本机反应时,我遇到了这个异常。有谁知道如何解决它?
崩溃堆栈如下:
*** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[RCTBatchedBridge perfStats]:无法识别的选择器发送到实例 0x7fe1195ca680'
*** 首先抛出调用栈:
(0 CoreFoundation 0x000000010f0bff65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010eb39deb objc_exception_throw + 48
2 CoreFoundation 0x000000010f0c858d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010f015f7a ___forwarding___ + 970
4 CoreFoundation 0x000000010f015b28 _CF_forwarding_prep_0 + 120
5 ReactNativeTest 0x000000010e5923ad -[RCTBatchedBridge _mainThreadUpdate:] + 429
6 QuartzCore 0x000000010fee7864 _ZN2CA7Display15DisplayLinkItem8dispatchEv + 50
7 QuartzCore 0x000000010fee772e _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 418
8 CoreFoundation 0x000000010f020364 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
9 CoreFoundation 0x000000010f01ff11 __CFRunLoopDoTimer + 1089
10 CoreFoundation 0x000000010efe18b1 __CFRunLoopRun + 1937
11 CoreFoundation 0x000000010efe0e98 CFRunLoopRunSpecific + 488
12 GraphicsServices 0x0000000113aeead2 GSEventRunModal + 161
13 UIKit 0x0000000110007676 UIApplicationMain + 171
14 ReactNativeTest 0x000000010e55615f main + 111
15 libdyld.dylib 0x00000001122e692d start + 1
16 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib:以 NSException
类型的未捕获异常终止
解决方案:Build Settings -> other linker flags -> 添加“-force_load”标签和你到 libReact.a
的路径
崩溃的原因是 perfStats 是 RCTPerfStats 的一个对象,它是 RCTBridge 的一个类别。
@interface RCTBridge (RCTPerfStats)
@property (nonatomic, strong, readonly) RCTPerfStats *perfStats;
@end
RCTBatchedBridge 是 RCTBridge 的子class。 [RCTBatchedBridge perfStats] 调用了在静态库中实现的类别方法。
然而,objective-c 链接器使事情稍微复杂化。
"Objective-C 没有为方法定义链接器符号。链接器符号仅为 classes 定义。
例如,如果 main.m 包含代码 [[FooClass alloc] initWithBar:nil];那么 main.o 将包含 FooClass 的未定义符号,但 -initWithBar: 方法的链接器符号将不在 main.o 中。
由于类别是方法的集合,因此使用类别的方法不会生成未定义的符号。这意味着如果 class 本身已经定义,链接器不知道加载定义类别的目标文件。这会导致与任何未实现的方法相同的 "selector not recognized" 运行时异常。"
https://developer.apple.com/library/mac/qa/qa1490/_index.html
但是如果您的项目不允许您采用 -ObjC 链接器标志,您可以尝试 -force_load 链接器标志。该标志只加载指定的库,对其他库影响不大。
全部。 当我在现有 iOS 应用程序中使用本机反应时,我遇到了这个异常。有谁知道如何解决它? 崩溃堆栈如下:
*** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[RCTBatchedBridge perfStats]:无法识别的选择器发送到实例 0x7fe1195ca680'
*** 首先抛出调用栈: (0 CoreFoundation 0x000000010f0bff65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010eb39deb objc_exception_throw + 48
2 CoreFoundation 0x000000010f0c858d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010f015f7a ___forwarding___ + 970
4 CoreFoundation 0x000000010f015b28 _CF_forwarding_prep_0 + 120
5 ReactNativeTest 0x000000010e5923ad -[RCTBatchedBridge _mainThreadUpdate:] + 429
6 QuartzCore 0x000000010fee7864 _ZN2CA7Display15DisplayLinkItem8dispatchEv + 50
7 QuartzCore 0x000000010fee772e _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 418
8 CoreFoundation 0x000000010f020364 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
9 CoreFoundation 0x000000010f01ff11 __CFRunLoopDoTimer + 1089
10 CoreFoundation 0x000000010efe18b1 __CFRunLoopRun + 1937
11 CoreFoundation 0x000000010efe0e98 CFRunLoopRunSpecific + 488
12 GraphicsServices 0x0000000113aeead2 GSEventRunModal + 161
13 UIKit 0x0000000110007676 UIApplicationMain + 171
14 ReactNativeTest 0x000000010e55615f main + 111
15 libdyld.dylib 0x00000001122e692d start + 1
16 ??? 0x0000000000000001 0x0 + 1
) libc++abi.dylib:以 NSException
类型的未捕获异常终止解决方案:Build Settings -> other linker flags -> 添加“-force_load”标签和你到 libReact.a
的路径崩溃的原因是 perfStats 是 RCTPerfStats 的一个对象,它是 RCTBridge 的一个类别。
@interface RCTBridge (RCTPerfStats)
@property (nonatomic, strong, readonly) RCTPerfStats *perfStats;
@end
RCTBatchedBridge 是 RCTBridge 的子class。 [RCTBatchedBridge perfStats] 调用了在静态库中实现的类别方法。
然而,objective-c 链接器使事情稍微复杂化。
"Objective-C 没有为方法定义链接器符号。链接器符号仅为 classes 定义。 例如,如果 main.m 包含代码 [[FooClass alloc] initWithBar:nil];那么 main.o 将包含 FooClass 的未定义符号,但 -initWithBar: 方法的链接器符号将不在 main.o 中。 由于类别是方法的集合,因此使用类别的方法不会生成未定义的符号。这意味着如果 class 本身已经定义,链接器不知道加载定义类别的目标文件。这会导致与任何未实现的方法相同的 "selector not recognized" 运行时异常。"
https://developer.apple.com/library/mac/qa/qa1490/_index.html
但是如果您的项目不允许您采用 -ObjC 链接器标志,您可以尝试 -force_load 链接器标志。该标志只加载指定的库,对其他库影响不大。