[RCTBatchedBridge perfStats]:发送到实例的无法识别的选择器

时间:2015-09-25 05:35:15

标签: react-native

所有。 当我在现有的iOS应用程序中使用react native时,我遇到了这个异常。有谁知道如何解决它? 崩溃堆栈如下:

***由于未捕获的异常终止应用程序' 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类型的未捕获异常终止

1 个答案:

答案 0 :(得分:2)

解决方案:构建设置 - >其他链接器标志 - >将“-force_load”标记添加到libReact.a的路径

这次崩溃的原因是perfStats是RCTPerfStats的一个对象,它是RCTBridge的一个类别。

@interface RCTBridge (RCTPerfStats)

@property (nonatomic, strong, readonly) RCTPerfStats *perfStats;

@end

RCTBatchedBridge是RCTBridge的子类。 [RCTBatchedBridge perfStats]调用了在静态库中实现的类别方法。

然而,objective-c链接器使事情稍微复杂化。

“Objective-C没有为方法定义链接符号。链接器符号仅为类定义。 例如,如果main.m包含代码[[FooClass alloc] initWithBar:nil];然后main.o将包含FooClass的未定义符号,但-initWithBar:方法的链接符号不在main.o中。 由于类别是方法的集合,因此使用类别的方法不会生成未定义的符号。这意味着如果已经定义了类本身,则链接器不知道加载定义类别的对象文件。这会导致对于任何未实现的方法都会看到相同的“选择器未识别”运行时异常。“

https://developer.apple.com/library/mac/qa/qa1490/_index.html

但是如果你的项目不允许你采用-ObjC链接器标志,你可以尝试-force_load链接器标志。此标志仅加载指定的库,对其他库影响不大。