Objective-C无法识别的选择器+使用MagicalRecord CocoaPod进行初始化

时间:2013-01-31 19:08:48

标签: objective-c cocoa magicalrecord cocoapods

注意:请参阅问题底部的更新,我已经设法进一步调试。

我认为这是我的项目设置的一个问题,但我不确定要看什么,因为没有编译错误。

我在项目中包含了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
}

初始化几乎是第一个要运行的代码,并且没有其他任何已经运行的代码与此冲突。

该行挂起,执行该行后没有任何内容。我已设法追踪挂起的位置。将消息传递给MagicalRecord会导致该类调用+initialize,但这不起作用。更具体地说,在initialize方法中调用的self上的任何方法都会导致抛出unrecognized selector异常。

据我所知,有两个奇怪的事情:

  1. 为什么找不到方法实现?
  2. 为什么会导致它挂起?
  3. 我对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构建设置的专家,所以我不确定我能得到多远。 < / p>

    更新2:

    是Xcode和项目设置的一个问题,它与较旧的Pod库链接,并且只在删除派生数据后导致问题。现在我回到了无法识别选择器问题的方块1。

4 个答案:

答案 0 :(得分:9)

解决方案是使用Pod库在产品设置中的其他链接器标志设置中使用-all_load链接器标志。

当您链接到pod库时,clang会删除未使用的符号,除非您这样做,并且由于您的应用程序未在任何地方调用+ swizzleShorthandMethods,因此它会被删除。

答案 1 :(得分:2)

对不起,我从来没有解决这个问题,看起来没有人知道它为什么不起作用。我试图与Magical Record的开发人员合作,但最终答案是不使用CocoaPods并手动添加代码。我希望我能更好地解决这个问题,但我没有时间花几天时间调试这个问题,我认为我对CocoaPods,Xcode编译过程和Objective-C运行时的了解不够调试它。

答案 2 :(得分:0)

我手动添加了MagicalRecord库并遇到了此错误。我的问题出在.pch文件中,因为MagicalRecord/CoreData+MagicalRecord.h的导入高于定义:#define MR_SHORTHAND

将上面的定义置于导入后解决了我的问题。

答案 3 :(得分:0)

Podfile更新MagicalRecord参考资料中,如下所示:

pod 'MagicalRecord/Shorthand', '~> 2.2'

它会在#define MR_SHORTHAND文件中包含Pods/Pods-MagicalRecord-prefix.pch