1

Instrumentsによると、私のオブジェクトにはrelease次の行でメッセージが送信されます。

[currentDefaults setObject:self.myArray forKey:@"storedArray"]

これにより、オーバーリリースとクラッシュが発生します。プロファイルされたときのNSZombiesは、この行と保持カウントの問題を検出しました。

しかし、なぜ?合成されたプロパティは次のとおりです。

@property (nonatomic, copy) NSArray*myArray;

上部の線が保持カウントを変更するのはなぜですか?

クラッシュ後のバックトレースは次のとおりです(上記の103行目は上記の行です)。

(lldb) bt
* thread #20: tid = 0x3103, 0x01e31276 CoreFoundation`CFRetain + 22, stop reason =     EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
frame #0: 0x01e31276 CoreFoundation`CFRetain + 22
frame #1: 0x01eeca00 CoreFoundation`__CFDictionaryStandardRetainValue + 80
frame #2: 0x01e74e62 CoreFoundation`__CFBasicHashReplaceValue + 34
frame #3: 0x01e41964 CoreFoundation`CFBasicHashSetValue + 2628
frame #4: 0x01e40ee3 CoreFoundation`CFDictionarySetValue + 227
frame #5: 0x01e773b5 CoreFoundation`-[CFXPreferencesSource setValue:forKey:] + 85
frame #6: 0x01e8a81e CoreFoundation`-[CFXPreferencesPropertyListSource setValue:forKey:] + 110
frame #7: 0x01e8a72f CoreFoundation`_CFXPreferencesSetValue + 159
frame #8: 0x01e8a5b3 CoreFoundation`CFPreferencesSetAppValue + 51
frame #9: 0x01372ceb Foundation`-[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 100
frame #10: 0x00003922 Ivory Bull Charts`__21-[SavedData saveData]_block_invoke_0 + 178 at SavedData.m:103
frame #11: 0x017a3330 libdispatch.dylib`_dispatch_call_block_and_release + 15
frame #12: 0x017a4439 libdispatch.dylib`_dispatch_worker_thread2 + 302
frame #13: 0x996a3b24 libsystem_c.dylib`_pthread_wqthread + 346
(lldb)
4

2 に答える 2

3

率直に言って、推測するだけです。

バックトレースには「CFBasicHashReplaceValue」があります。私の推測では、オブジェクトを新しいキーで追加するだけでなく、このディクショナリ内で同じキーを使用する既存のオブジェクトを置き換えていると思います。

その既存のオブジェクトはディクショナリから削除され、解放されます。その既存のオブジェクトは、これが発生する前に過剰にリリースされている可能性があります。

于 2012-08-09T13:28:08.417 に答える
1

配列またはディクショナリのコピーを作成し、インスタンス変数自体ではなくユーザーデフォルトに保存し、同じ変数の内容をユーザーデフォルトに再保存したときに保持の問題が発生しないかどうかを確認します。

于 2012-08-10T03:16:00.037 に答える