注意:请参阅问题底部的更新,我已经设法在调试方面取得了更多进展。
我认为这是我的项目设置的问题,但我不确定要查看什么,因为没有编译错误。
我在项目中包含了 MagicalRecord 2.1(当前稳定版),CocoaPods 对其进行管理。我没有更改 CocoaPods 的任何build设置,它完美地管理了我的其他依赖项,到目前为止我还没有遇到任何问题。
我已经添加了 #import <MagicalRecord/CoreData+MagicalRecord.h>
到我的App-Prefix.pch
文件,Xcode 为我提供了正确设置时我期望的所有符号建议。我没有收到任何编译器错误,所以我只能假设 CocoaPods 已成功将 MR 构建到库中,并且我已成功将其导入到我的代码中。
当我在我的应用程序委托(delegate)中初始化 MagicalRecord 时出现问题:
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
[MagicalRecord setupCoreDataStack];
//... other code
}
初始化几乎是第一个要运行的代码,并且没有其他运行的代码会与此冲突。
该行挂起,执行该行后什么也没有。我已经设法找到挂起发生的地方。将消息传递给 MagicalRecord
导致类(class)有+initialize
调用它,但那是行不通的。更具体地说,self
上的任何方法在初始化方法中调用的是导致 unrecognized selector
抛出异常。
据我所知,这有两件奇怪的事情:
- 为什么找不到方法实现?
- 为什么会导致它挂起?
我不太了解Objective-C是如何使用initialize方法的,它在抛出异常时是否会挂起?
这是异常发生时的堆栈跟踪:
frame #0: 0x00007fff93a2e3c5 libobjc.A.dylib`objc_exception_throw
frame #1: 0x00007fff996dc31a CoreFoundation`+[NSObject(NSObject) doesNotRecognizeSelector:] + 186
frame #2: 0x00007fff996341ee CoreFoundation`___forwarding___ + 414
frame #3: 0x00007fff99633fd8 CoreFoundation`_CF_forwarding_prep_0 + 232
frame #4: 0x000000010004e32c River`+[MagicalRecord initialize] + 92 at MagicalRecord.m:89
frame #5: 0x00007fff93a25236 libobjc.A.dylib`_class_initialize + 310
frame #6: 0x00007fff93a250f3 libobjc.A.dylib`prepareForMethodLookup + 164
frame #7: 0x00007fff93a24eef libobjc.A.dylib`lookUpMethod + 71
frame #8: 0x00007fff93a232fc libobjc.A.dylib`objc_msgSend + 188
frame #9: 0x0000000100001d36 MyApp`-[AppDelegate applicationDidFinishLaunching:] + 86 at AppDelegate.m:46
非常感谢任何对此的帮助,包括我可以尝试进一步调试它的技巧。
更新:
删除我的 Derived Data 目录后,程序无法链接到 Pod。我相信 Xcode 在我添加 MagicalRecord 并链接到它的旧版本后无法构建 Pod(这可能是错误的,我不确定)。
这似乎是 Xcode 和/或 CocoaPods 的问题。我正在尝试找出如何让它正确构建 Pod,但我不是 CocoaPods 或 Xcode build设置方面的专家,所以我不确定我能走多远。
更新 2:
Xcode 和项目设置存在问题,它正在与较旧的 Pod 库链接,并且仅在删除派生数据后才导致问题。现在我回到第 1 个方 block ,解决无法识别的选择器问题。
最佳答案
解决方案是在使用 Pod 库的产品的设置中的 Other Linker Flags 设置中使用 -all_load
链接器标志。
当您链接到 pod 库时,除非您这样做,否则 clang 会删除未使用的符号,并且由于您的应用程序不会在任何地方调用 +swizzleShorthandMethods,它会被删除。
关于Objective-C 无法识别的选择器 + 使用 MagicalRecord CocoaPod 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633274/