3

注:質問の下部にある更新を参照してください。デバッグをさらに進めることができました。

これはプロジェクトのセットアップの問題だと思いますが、コンパイル エラーがないため、何を調べればよいかわかりません。

CocoaPods が管理するプロジェクトに MagicalRecord 2.1 (現在の安定版) が含まれています。CocoaPods のビルド設定は変更していません。他の依存関係は完全に管理されており、これまでのところ問題はまったくありません。

ファイルに追加#import <MagicalRecord/CoreData+MagicalRecord.h>したところ、App-Prefix.pchXcode は、正しいセットアップで期待されるすべてのシンボルの提案を提供してくれました。コンパイラ エラーは発生しないので、CocoaPods が MR をライブラリに正常に組み込み、これをコードに正常にインポートしているとしか思えません。

問題は、アプリケーション デリゲートで MagicalRecord を初期化するときに発生します。

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

  //... other code
}

初期化はほぼ最初に実行されるコードであり、これと競合する実行されたコードは他にありません。

この行はハングし、その行以降は何も実行されません。ハングが発生した場所を突き止めることができました。にメッセージを渡すMagicalRecordと、クラスがそれを+initialize呼び出してしまい、それが機能していません。より具体的には、initialize メソッドで呼び出されたすべてのメソッドが例外のスローをself引き起こしています。unrecognized selector

私が見る限り、これには2つの奇妙な点があります。

  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

さらにデバッグを試みることができるトリックを含め、これに関するヘルプは大歓迎です。

アップデート:

Derived Data ディレクトリを削除した後、プログラムが Pod にリンクできませんでした。MagicalRecord を追加した後、Xcode が Pod のビルドに失敗し、その古いバージョンにリンクしていたと思います (これについては間違っている可能性がありますが、確かではありません)。

これは、Xcode および/または CocoaPods の問題のようです。Pod を適切にビルドする方法を見つけようとしていますが、CocoaPods や Xcode ビルド設定の専門家ではないため、どこまで到達できるかわかりません。

更新 2:

Xcode とプロジェクトのセットアップに問題があり、古い Pod ライブラリとリンクしていたため、派生データが削除された後にのみ問題が発生しました。今、認識されていないセレクターの問題で正方形 1 に戻りました。

4

4 に答える 4

9

解決策は、Pod ライブラリを使用する製品の設定の [その他のリンカー フラグ]-all_load設定でリンカーフラグを使用することです。

Pod ライブラリにリンクすると、clang は未使用のシンボルを削除します。+swizzleShorthandMethods はアプリケーションによって呼び出されないため、削除されます。

于 2013-02-24T01:42:39.237 に答える
2

申し訳ありませんが、これを解決したことはありません。なぜ機能しなかったのか、誰にもわからないようです。マジカルレコードの開発者と一緒に解決しようとしましたが、最終的に答えは CocoaPods を使用せず、手動でコードを追加することでした。これにより良い解決策を提供できればと思いますが、この問題のデバッグに何日も費やす時間はありません。また、CocoaPods、Xcode のコンパイル プロセス、Objective-C ランタイムについて十分に理解しているとは思えません。それをデバッグします。

于 2013-02-15T14:59:32.707 に答える
0

次のようにPodfile更新 MagicalRecord 参照で:

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

それは#define MR_SHORTHANDあなたのPods/Pods-MagicalRecord-prefix.pchファイルに含まれます。

于 2014-06-25T09:36:27.433 に答える
0

ライブラリを手動で追加したところ、MagicalRecordこのエラーが発生しました。MagicalRecord/CoreData+MagicalRecord.hのインポートがdefine: の上にあったため、私の問題は .pch ファイルにありました#define MR_SHORTHAND

定義をインポートの上に置くと、問題が解決しました。

于 2013-07-21T22:32:43.123 に答える