2

ある時点で Core Data fetch を使用して一連のデータを取得し、XCode で通常の Core Data の方法で作成され、したがって から派生したオブジェクトを に挿入するクラスがありNSManagedObjectますNSMutableSet。状況によっては、これらのオブジェクトの一部が他のいくつかのセットになる可能性があります。ここまでは順調ですね。

しかし、その後、次のことが起こります。

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です。

問題は、使用可能な注釈の配列を取得しても、currentResults、 、およびによって触れられた のpreviousResultsいずれかを参照するその他のオブジェクトが最終的に破棄されることです。MyObjectcreateAnnoFromMyObject:

ゴミ箱に入れられたとは、それらにアクセスしようとすると、次の行に沿って例外が発生することを意味します

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

コマンドを使用してデバッガー ペインでこれらのコレクションのいずれかを表示しようとすると、同じことが起こりますpo

MyObjectCore Data で再生成を試みましたが、うまくいきませんでした。Google ではこのセレクターについての言及はほとんどbeginningOfDocumentなく、何が間違っているのかわかりません。おそらくこの問題を解消する回避策がありますが、何が起こっているのかを知ることは本当に素晴らしいことです.

4

2 に答える 2

3

また、iOS5.xbeginningOfDocumentの (サブクラスの) インスタンスで呼び出されていた、この特定の認識されないセレクターの問題にも遭遇しました。NSManagedObjectただし、この問題は 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;
}
于 2013-01-31T21:04:29.007 に答える
0

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

この理論を証明するために、Instruments で Zombies を実行できます。

于 2012-04-27T07:58:11.443 に答える