2013-01-31 25 views
2

注意:請參閱問題底部的更新,我設法進一步調試。Objective-C無法識別的選擇器+用MagicalRecord初始化CocoaPod

我相信這是我的項目設置的問題,但我不知道要看,因爲沒有編譯錯誤是什麼。

我有MagicalRecord 2.1(當前的穩定),包括在具有的CocoaPods管理IT項目。我沒有更改CocoaPods的任何構建設置,它完全管理我的其他依賴關係,迄今爲止我還沒有任何問題。

我已經加入#import <MagicalRecord/CoreData+MagicalRecord.h>App-Prefix.pch文件,Xcode是我提供的所有符號的建議我希望有一個正確的設置。我沒有收到任何編譯器錯誤,所以我只能假設CocoaPods已成功將MR構建到庫中,並且我已成功將其導入到我的代碼中。

問題是當我在我的應用程序委託初始化MagicalRecord:

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

    //... other code 
} 

初始化幾乎要運行的第一個代碼,沒有別的,已運行這將這場衝突。

此行掛起,沒有什麼行後執行。我設法追蹤了掛起發生的地方。將消息傳遞給MagicalRecord正在導致該類調用+initialize,並且這不起作用。更具體地說,在初始化方法中調用的self上的任何方法都會導致引發unrecognized selector異常。

有兩件怪事關於這個問題,據我可以看到:

  1. 爲什麼不能找到方法實現?
  2. 爲什麼會導致它掛?

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

任何幫助,包括技巧,我可以嘗試進一步調試它,是極大的讚賞。

更新:

刪除我導出的數據目錄後,該方案未能鏈接到吊艙。我相信在添加MagicalRecord之後,Xcode無法構建Pod,並鏈接到它的舊版本(可能是錯誤的,我不確定)。

這似乎是一個Xcode和/或CocoaPods問題。我正在努力研究如何讓它正確地構建Pod,但我不是CocoaPods或Xcode構建設置的專家,所以我不確定我會得到多遠。

更新2:

在Xcode和項目設置有問題,它是用較低波德庫鏈接,並且只有導出的數據被刪除後,引起的問題。現在我回到了第一個無法識別的選擇器問題。

+0

看起來像你打電話或MagicalRecord本身的問題。 –

+0

這是我想過的,但是看到沒有人報告過這個問題,我懷疑這是我的項目設置的問題。但是我對Objective-C內部知識不夠了解,不知道爲什麼它不能找到這些方法。 – danpalmer

回答

9

解決方案是使用其他鏈接器標記中的-all_load鏈接器標記設置使用Pod庫的產品設置。

當您鏈接到pod庫時,clang會去除未使用的符號,除非您這樣做,並且+ swizzleShorthandMethods不會被您的應用程序在任何地方調用,否則會被剝離。

+0

這已經足夠接近,所以標記爲答案。實際的問題是-all_load和-ObjC沒有在主項目中使用,而是在Pods項目中使用。 – danpalmer

+0

添加'-all_load'標誌會產生'重複符號_OBJC_CLASS _ $ _ AFImageCache'錯誤。 – derpoliuk

2

對不起,我從來沒有解決過這個問題,看起來沒有人知道它爲什麼不起作用。我試圖與Magical Record的開發人員一起解決它,但最終答案是不使用CocoaPods並手動添加代碼。我希望我能給出一個更好的解決方案,但我沒有時間花費數天的時間來調試這個問題,我不認爲我對CocoaPods,Xcode編譯過程和Objective-C運行時已經足夠了解調試它。

0

我手動添加了MagicalRecord庫並遇到此錯誤。我的問題是在.pch文件中,因爲MagicalRecord/CoreData+MagicalRecord.h的導入高於定義:#define MR_SHORTHAND

把定義上面的導入解決了我的問題。

0

在你Podfile更新MagicalRecord參考如下:

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

這將包括在Pods/Pods-MagicalRecord-prefix.pch文件#define MR_SHORTHAND

相關問題