dan*_*mer 3 cocoa objective-c cocoapods magicalrecord
注意:请参阅问题底部的更新,我已经设法进一步调试.
我认为这是我的项目设置的一个问题,但我不知道该怎么看,因为没有编译错误.
我在项目中包含了MagicalRecord 2.1(当前稳定版),CocoaPods管理它.我没有更改CocoaPods的任何构建设置,它完全管理我的其他依赖项,到目前为止我还没有任何问题.
我已经添加#import <MagicalRecord/CoreData+MagicalRecord.h>到我的App-Prefix.pch文件中,Xcode正在为我提供所有符号建议,我希望通过正确的设置.我没有得到任何编译器错误,所以我只能假设CocoaPods已成功将MR构建到库中,并且我已成功将其导入到我的代码中.
当我在我的应用程序委托中初始化MagicalRecord时出现问题:
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
[MagicalRecord setupCoreDataStack];
//... other code
}
Run Code Online (Sandbox Code Playgroud)
初始化几乎是第一个要运行的代码,并且没有其他任何已经运行的代码与此冲突.
该行挂起,执行该行后没有任何内容.我已设法追踪挂起的位置.传递消息MagicalRecord导致类+initialize调用它,这是行不通的.更具体地说,self在initialize方法中调用的任何方法都会导致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
Run Code Online (Sandbox Code Playgroud)
任何有关这方面的帮助,包括我可以尝试进一步调试的技巧,都非常感谢.
更新:
删除我的Derived Data目录后,该程序无法链接到Pod.我相信Xcode在我添加了MagicalRecord之后无法构建Pod,并且链接到它的旧版本(可能是错误的,我不确定).
这似乎是Xcode和/或CocoaPods问题.我正在尝试弄清楚如何正确地构建Pod,但我不是CocoaPods或Xcode构建设置的专家,所以我不确定我会得到多远.
更新2:
还有就是用Xcode和项目的设置有问题,它是用较低波德库链接,并且只有导出的数据被删除后,引起的问题.现在我回到了无法识别的选择器问题的方块1.
解决方案是使用Pod库在产品设置中的Other Linker Flags设置中使用-all_load链接器标志.
当您链接到pod库时,clang会删除未使用的符号,除非您这样做,并且由于您的应用程序未在任何地方调用+ swizzleShorthandMethods,因此它会被删除.