2

私はiVarを持っていてNSMutableArray* _syncModels、クラスのinitメソッドで次のように初期化します。_syncModels = [[NSMutableArray alloc] initWithCapacity:10];

クラス全体で、配列にオブジェクトを追加したり、配列からオブジェクトを削除したりしていますが、再初期化することはありません_syncModels

だから私はこのクラッシュレポートを受け取ります-[NSConcreteData filterUsingPredicate:]: unrecognized selector sent to instance 0x23c740c0

象徴した後、このクラッシュを引き起こした線は[_syncModels filterUsingPredicate:[NSPredicate predicateWithFormat:@"NOT (dataManagerFieldRecord = nil)"]];

世界でどのようにからに_syncModels変わることができますか?NSMutableArrayNSConcreteData

この特定のクラッシュはまれですが、一部のオブジェクトが混乱し、処理できないメッセージが送信される場合、これらのクラッシュがさらに発生しています。

ARCでは6.1をターゲットにしています。

編集

私は問題を理解しました...私は誤ってself(への参照を所有する)をのメソッド_syncModelsからディスパッチキューに追加していました...したがって、これはメモリ管理の問題です...selfdealloc

4

1 に答える 1

5

iVarがそのタイプを変更する原因となる条件は何ですか?

私が想像できる唯一のケースは、プログラマーがソースコードのタイプを変更して再コンパイルすることです。

つまり、ivarに格納されているポインタが指すオブジェクトが変更されているということです。これは典型的なメモリ管理エラーであり、通常、そこにあると予想されるオブジェクトがすでに時期尚早に割り当て解除されていることを意味します(オブジェクトへの十分な参照が保持されていないため)。その後、ランタイムは、作成時に基になるメモリチャンクを再利用します。新しいオブジェクトが必要でした。

于 2013-02-27T16:42:07.587 に答える