注意: 请参阅问题底部的更新,我在调试方面取得了更大的进展。
我相信这是我的项目设置的问题,但我不确定要查看什么,因为没有编译错误。
我在项目中包含 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
会导致类调用 +initialize
,但这是行不通的。更具体地说,在 initialize 方法中调用的 self
上的任何方法都会导致抛出 unrecognized selector
异常。据我所知,这有两件奇怪的事情:
我不太了解Objective-C如何使用初始化方法,它是否会在抛出异常时挂起?
这是发生异常时的堆栈跟踪:
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
对此的任何帮助,包括我可以尝试进一步调试它的技巧,都非常感谢。
更新:
删除我的派生数据目录后,程序无法链接到 Pod。我相信在我添加 MagicalRecord 并链接到它的旧版本后,Xcode 无法构建 Pod(这可能是错误的,我不确定)。
这似乎是 Xcode 和/或 CocoaPods 的问题。我正在努力研究如何让它正确构建 Pod,但我不是 CocoaPods 或 Xcode build设置方面的专家,所以我不确定我能走多远。
更新 2:
Xcode 和项目设置存在问题,它与较旧的 Pod 库链接,并且仅在派生数据被删除后才会导致问题。现在我回到了无法识别的选择器问题的第 1 方格。
最佳答案
解决方案是在使用Pod库的产品设置中的 Other Linker Flags 设置中使用-all_load
链接器标志。
当您链接到 pod 库时,clang 会删除未使用的符号,除非您这样做,并且由于您的应用程序不会在任何地方调用 +swizzleShorthandMethods,因此它会被删除。
关于使用 MagicalRecord CocoaPod 在 +initialize 上无法识别的 Objective-C 选择器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14633274/