0

移行後、ゼロ以外の数値の 1 つがゼロとして表示されるようになりました。移行しない場合、値はゼロ以外の値を保持します。

最初に、次のように管理対象オブジェクトに数値を設定しようとしました。

[temp setNumUses:temp.numUses+1];

...しかし、それにより「EXC_BAD_ACCESS」が発生したため、次のように変更しました。

int hold = ((int)[[temp valueForKey:@"numUses"] intValue]);
hold++;
[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

...しかし、移行後、このコードはhold、新しいコードを実行する前に、その値が明らかに1以上であったときに、値が0のintとして初期化されたと主張しました(1回だけ使用されたテストオブジェクトを参照)。

Core Data Database を移行しない場合、NSNumber は、多くのコンテキストの保存とアプリケーションの終了を通じて、その値を正常に保持します。

何が欠けている可能性がありますか?他の場所に保存されているデータベースで変更された NSManagedObjects の値を変更する広範なコードがありますが、「numUses」を改ざんするコードはありません。

考え?

4

1 に答える 1

0

最も簡単な説明は、移行numUsesにより、デフォルト値がゼロの新しい属性である Core Data が何らかの形で納得するということです。この理由は、提供した割り当てコードではなく、移行モデルにあります。

ただし、親のコードは、NSNumber をよく理解していないことを示唆しており、他の場所で NSNumber を使用しないと問題が発生する可能性があります。

NSNumber は、数値の単なるオブジェクト ラッパーです。操作を実行することはできません。そのため、この行は次のとおりです。

[temp setNumUses:temp.numUses+1];

... を引き起こしますEXC_BAD_ACCESS。発見したように、NSNumber を int または NSDecimalNumber に変換して、数値演算を実行する必要があります。

この行:

[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

...メモリリークします。NSNumber オブジェクトを初期化しますが、解放しません。この場合 (およびすべてのケースの大部分) は、クラス メソッドを使用して NSNumber を作成する必要があります。NSNumber は、リークしない自動解放オブジェクトを返すためです。そう:

[temp setNumUses:[NSNumber numberWithInt:hold];

一般に、メソッド パラメーターでオブジェクトを初期化することはお勧めできません。追跡するのが非常に難しい厄介なメモリリークを求めています。リークのレポートは、メソッドが呼び出されたコードではなく、メソッド自体に表示される場合があります。

于 2010-09-26T14:06:13.313 に答える