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

标签 objective-c cocoa magicalrecord cocoapods

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

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

我在项目中包含了 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抛出异常。

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

  1. 为什么找不到方法实现?
  2. 为什么会导致它挂起?

我不太了解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/

相关文章:

ios - 在没有层次结构的两个 View Controller 之间切换

cocoa - Lion 上滚动刷新

ios - 如何在 swift 中使用 MR 从 coreData 获取数据

mvvm - 在 View 模型上测试RACCommand

ios - XCode中Document下 'Notes'的用途是什么

objective-c - 什么是 NSTaggedDate?

ios - 未调用 UITableview 委托(delegate)

ios - 代码仅在我在实现 {} 中初始化对象时才有效

objective-c - 为 Mac 创建一个可定制的 GUI 有多难?

ios - MagicalRecord:多个数据库