Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标-C在+上的选择器无法识别;用MagicalRecord CocoaPod初始化_Objective C_Cocoa_Magicalrecord_Cocoapods - Fatal编程技术网

Objective c 目标-C在+上的选择器无法识别;用MagicalRecord CocoaPod初始化

Objective c 目标-C在+上的选择器无法识别;用MagicalRecord CocoaPod初始化,objective-c,cocoa,magicalrecord,cocoapods,Objective C,Cocoa,Magicalrecord,Cocoapods,注意:请参见问题底部的更新,我已设法在调试方面取得了更大进展 我认为这是我的项目设置中的一个问题,但我不确定该看什么,因为没有编译错误 我有MagicalRecord 2.1(当前稳定)包含在项目中,由CocoaPods管理。我没有更改CoCoapod的任何构建设置,它完美地管理了我的其他依赖项,到目前为止我还没有遇到任何问题 我已将#import添加到我的App Prefix.pch文件中,Xcode为我提供了正确设置所需的所有符号建议。我没有得到任何编译器错误,所以我只能假设CocoaPod

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

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

我有MagicalRecord 2.1(当前稳定)包含在项目中,由CocoaPods管理。我没有更改CoCoapod的任何构建设置,它完美地管理了我的其他依赖项,到目前为止我还没有遇到任何问题

我已将
#import
添加到我的
App Prefix.pch
文件中,Xcode为我提供了正确设置所需的所有符号建议。我没有得到任何编译器错误,所以我只能假设CocoaPods已经成功地将MR构建到库中,并且我正在成功地将其导入到我的代码中

在应用程序委托中初始化MagicalRecord时出现问题:

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
  [MagicalRecord setupCoreDataStack];

  //... other code
}
初始化几乎是要运行的第一个代码,并且已经运行的任何其他代码都不会与此冲突

该行挂起,执行该行后没有任何内容。我设法找到了绞刑发生的地方。将消息传递给
MagicalRecord
会导致类对其调用
+initialize
,但这不起作用。更具体地说,在初始化方法中调用的
self
上的任何方法都会导致引发
无法识别的选择器
异常

在我看来,这有两件奇怪的事:

  • 为什么它找不到方法实现
  • 为什么它会被挂起来
  • 我对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
    
    非常感谢在这方面的任何帮助,包括我可以尝试进一步调试它的技巧

    更新:

    删除我的派生数据目录后,程序无法链接到POD。我相信在我添加MagicalRecord并链接到它的旧版本后,Xcode未能构建POD(这可能是错误的,我不确定)

    这似乎是Xcode和/或CocoaPods问题。我正在尝试如何让它正确地构建Pod,但我不是cocoapod或Xcode构建设置方面的专家,所以我不确定我能走多远

    更新2:


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

    很抱歉,我从未解决过这个问题,而且似乎没有人知道它为什么不起作用。我试图与Magic Record的开发人员一起解决这个问题,但最终的答案是不使用CocoaPods并手动添加代码。我希望我能给出一个更好的解决方案,但我没有时间花几天调试这个问题,而且我认为我对CocoaPods,Xcode编译过程了解不够,和Objective-C运行时进行调试。

    解决方案是使用Pod库产品设置中的
    -all\u load
    链接器标志


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

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


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

    在您的
    播客文件中
    更新MagicalRecord参考,如下所示:

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

    它将在您的
    Pods/Pods MagicalRecord prefix.pch
    文件中包含
    #define MR#u速记

    看起来像是您正在调用的某个东西或MagicalRecord本身的问题。这是我的想法,但鉴于没有其他人报告此问题,我怀疑这是我的项目设置问题。但我对Objective-C的内部结构了解不够,无法理解它为什么找不到方法。这已经足够接近了,所以被标记为答案。实际问题是-all_load和-ObjC没有在主项目本身中使用,而不是在Pods项目中使用。添加
    -all_load
    标志会生成
    重复符号\u ObjC\u CLASS\u$\ u AFImageCache
    错误。