2012-04-26 7 views
2

ある時点で、Core Dataフェッチでデータの束を取得し、通常のCore Dataの方法で作成されたオブジェクトをNSManagedObjectNSMutableSetに変換する。どのように動作するかによって、これらのオブジェクトのいくつかは他のいくつかのセットに終わることがあります。ここまでは順調ですね。プロパティにアクセスしたときにNSManagedObjectから派生したオブジェクトの破損

しかし、その後、次のようになります。

NSMutableArray* anArray = [NSMutableArray alloc] init; 
[currentResults minus:previousResults]; // both are NSMutableSets 
for(MyObject* obj in currentResults) 
{ 
    [anArray addObject:[createAnnoFromMyObject:obj]]; // nastiness happens here 
} 

createAnnoFromMyObj:が行うすべてがobjからデータを引き出し、MKAnnotationを実装するオブジェクトを返します。

問題は、私は、使用可能な注釈、currentResultspreviousResults、およびcreateAnnoFromMyObject:終わりまでに心を打たれたMyObject秒のいずれかを参照する他のオブジェクトの配列を取得ものの、ゴミ箱なっていることです。

ことでは、私がpoコマンドでデバッガペインにこれ​​らのコレクションのいずれかを表示しようとしたとき、彼らに

-[MyObject beginningOfDocument]: unrecognized selector sent to instance... 

の線に沿って例外で結果をアクセスしようとすると、同じ問題が発生したことを意味ゴミ箱に移動します。

コアデータにはMyObjectを再生してみましたが、運はありませんでした。このbeginningOfDocumentセレクターはGoogleにはほとんど言及されておらず、何が間違っているのか分かりません。おそらくこの問題を解決する回避策がありますが、何が起こっているのか知ることは本当にうれしいでしょう。

答えて

3

この特別な認識不能なセレクタの問題 - iOS5.xのNSManagedObjectインスタンスのbeginningOfDocumentが(サブクラスの)サブクラスで呼び出されていました。しかし、問題はiOS6で修正されるように見えます。 NSZombiesが私に何も与えなかったことは確かですが、確かに直感のように思えました。

管理対象オブジェクトの検索でvalueForKeyルックアップが実行されたときに、認識できないセレクタ例外がスローされたため、スタックトレースを調べて、例外がスローされる場所であるかどうか調べる価値があります。

私たちの場合、「壊れた」キーはfullTextであり、私たちの属性の1つの名前です。名前を変更すると問題は解決しました。私の推測では、その名前は基本的なsqliteクエリでエラーが発生しています(フルテキストはキーワードではないと思っていましたが、sqliteでフルテキストを検索していると思われます)、おそらくクエリ引数がiOS6でよりうまく消されました。

この小さなチートで壊れたキー/属性名を知ることができます:valueForKey:メソッドをNSLogに一時的にオーバーライドしてから、スーパークラスのバージョンを呼び出して戻すだけです。ドキュメントはそれを上書きしないと言っていますが(問題のある属性を見つけるためにしばらくしています)、スーパークラス実装をオーバーライドして呼び出しているので、これは問題ありません。再度実行すると

// Don't forget to remove me after the bug is fixed! 
- (id)valueForKey:(NSString *)key { 
    NSLog(@"Finding value for key: %@", key); 
    return [super valueForKey:key]; 
} 

はその後、あなたがクラッシュする前にvalueForKey:への最後の呼び出しを参照して名前が壊れている属性を知っているでしょう。

それでも問題が解決うち失敗したルックアップだったの並べ替えを持っている場合は、あなたがより冗長に行くことができる:

// Don't forget to remove me after the bug is fixed! 
- (id)valueForKey:(NSString *)key { 
    NSLog(@"Finding value for key: %@", key); 
    id retVal = [super valueForKey:key]; 
    NSLog(@"Success for key: %@", key); // or print retVal for fun 
    return retVal; 
} 
+1

それを追跡しておきます。 'fullText'は私たちのCore Dataモデルのどこにでもありました。残念ながら、改訂はクラッシュのためにコミットされたことはないので、検証するのは難しいでしょうが、データに基づいて、フィールド名が問題だったように見えます。これを答えにしてください。 – dandan78

+1

素晴らしい - 私はポストが少なくともいくつかの謎を解決するのに役立つことがうれしいです!それをマークしていただきありがとうございます。 – Kelly

+1

この投稿に感謝します。同じ 'beginningOfDocument'メソッド呼び出しで全く同じ'認識できないセレクタ 'クラッシュがありました。このクラッシュは、私たちが使用しているRestKitフレームワーク内で発生しました。だから、それはKVCやiOS5と関係があり、RestKitではないことを理解するまでには時間がかかりました。あなたの記事のおかげで、我々は正しい方向を指摘し、CoreDataモデルでも 'fullText'を見つけました。問題が解決しました。 –

0

MyObjectが割り当て解除されているようです。私はこの場合ARCを使用していると思いますし、MyObjectオブジェクトを保持しているものはありません(NSSetsオブジェクトが何らかの形で保持されていることを確認してください)。つまり、現在の実行ループの最後にリリースされ、エラーが表示されます。

この理論を証明するためにゾンビをインストゥルメントで実行できます。

+0

ええ、私はARCを使用しています。 MyObjectsの割り当てが解除されているケースはないと思います。なぜなら、それぞれのインスタンスに対して少なくとも1つの参照が存在するからです。セットはクラスの比率であるため、割り当てが解除されることはほとんどありません。また、Instrumentsは問題を報告しません。 – dandan78

+0

あなたはクラス間で管理対象オブジェクトを渡していませんか?または、それを作成したもの以外のmocで同じオブジェクトを使用しようとしていますか? –

+0

別のクラスからMyObjectsを取得していますが、フェッチとリターンの単純なケースです。私はこれをすることに関する警告に遭遇していない。また、Mocも混合しません。 – dandan78

関連する問題