3
- (void)tableView:(UITableView *)tableView 
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = indexPath.row;

    if (row == NSNotFound)
        return;

    if (call.uid != kABRecordInvalidID)
    {
        ABAddressBookRef addressBook = ABAddressBookCreate();

        ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                                call.uid);


       // CFRelease(addressBook);// commenting out this makes the program not crash

}
}

ここに問題があります。アドレス帳を解放していないため、静的コード分析でメモリ リークが発生していることがわかりました。解放しようとしましたが、解放された画面に戻ってこの関数を再度呼び出すと、アプリがクラッシュします。

のアクセサリ ボタンをクリックするとしますuitableview。やらなければならないことをして元のウィンドウに戻り、もう一度アクセサリ ボタンをクリックするuitableviewと、プログラムが次のエラーでクラッシュします。

-[タイプ保持ではありません]: 割り当て解除されたインスタンス 0x618d810 にメッセージが送信されました

4

1 に答える 1

8

アドレス帳は、(直接的に) クラッシュを引き起こしているものではありません。

あなたはあなたの人を保持しているのではなく、彼/彼女への参照を得ているだけです. あなたの人に使っ CFRetainてみてください。

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);
于 2012-08-21T16:55:37.713 に答える