2011-01-19 10 views
0

何らかの理由により、私のアプリが特定の動作でクラッシュしました。調査の結果、すでにリリースされているものをリリースしたことが原因であることが判明しました。それから私はインターネット上で、私が実装したNSZombieとMallocStackLoggingを使って、これを原因として追跡して、結果としてこれを得ることができると読んでいます。mallocエラー - [CFString release]

NSZombie:2011-01-19 14:39:09.523 イオタ[13649:207] * - [ 放出のCFString]:0xeeaf510

malloc_history

インスタンスを割り当て解除に送信されたメッセージを

ALLOC 0xeeaf510-0xeeaf52f [サイズ= 32]: thread_a0041500 | start |メイン| UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | CFRunLoopRun | __CFRunLoopDoTimer | __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION | __NSFireDelayedPerform | - [UITableView _userSelectRowAtIndexPath:] | - [UITableView _selectRowAtIndexPath:アニメーション:scrollPosition:notifyDelegate:] | - [CorpDirViewController tableView:didSelectRowAtIndexPath:] | - [CorpDirPersonViewController corpDirViewController:shouldContinueAfterSelectingContact:] | - [ContactItem mergeWithContact:] | - [ContactItem getValueForProperty:] | | ABRecordCopyValue | CPRecordCopyProperty | CPRecordGetProperty | ABCMultiValueLoad | ABCDBContextFetchMultiValuePropertyIntoRecord | | ABCDBContextFetchMultiValueEntries | CPSqliteStatementSendResults | CollectMultiValueEntries | _sqliteStatementApplyValuesFromRecordWithNullValue | CFStringCreateWithCString | __CFStringCreateImmutableFunnel3 | _CFRuntimeCreateInstance | malloc_zone_malloc

今、クラッシュの原因を特定できません。誰もそれで私を助けることができますか?

+0

質問を読みやすい状態にフォーマットしてください:-) – DarkDust

答えて

0

その文字列の割り当て/解除を確認してください。 alloc + retainの数は、解放数と同じでなければなりません。 自動解放オブジェクトを解放しないでください。

+0

以前に保持していた場合は、自動リリースされたオブジェクトをリリースする必要があります。 –

+0

はい、それは正しいです。 –

+0

この問題は、ヘッダファイルで割り当てられたNSStringから発生していることに気付きました。非原子的に変更した後、すべてが完璧に機能しました! – HurkNburkS

1

既に知っているように、すでに破壊されているオブジェクトに対してreleaseを呼び出しています。つまり、releaseをオブジェクト(この場合はNSString)に1回多く呼びます。 NSZombieEnabledを介して行われた例外は、「一度にあまりにも多くの」リリースがどこで行われたかを示します。しかし、ほとんどの場合、その間のリリースを探していて、それはやりにくいです...

ここでは、クラッシュする場所を知っているので(どの変数が関係しているかを知っておく必要があります)この変数を公開しているコード、またはオブジェクトがその変数にどのように割り当てられて、それらのソースを検査するかを指定します。つまり、オブジェクトがどこから由来したのか、それを使って何を行ったのかを「バックトラック」する必要があります。あなたの生活のどこかで、retainそれを忘れたか、偶然、release/autoreleaseあなたはどこにいけないのですか?

+0

しかし、NSStringオブジェクトを明示的にリリースすることはありません。 - [CFString release]とはどういう意味ですか? –

+0

'CFString'はNSStringの基本クラスです。あなたはNSStringをリリースしますが、例外はそれを証明します;-)これでどこを見つける必要がありますか? – DarkDust

関連する問題