注意: 请参阅问题底部的更新,我在调试方面取得了更大的进展。

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

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

    10-12 03:35