2011-07-01 15 views
0

私のUITableViewのデータソースとしてNSMutableDictionaryがあります。私は、削除モードを実装しようとしている問題がある。NSMutableDictionaryからオブジェクトを削除するときのEXC_BAD_ACCESSエラー

私は削除しようとしているキーと、それが対応しているオブジェクトが、割り当てられていないメモリや何かにアクセスしようとしているように見えます。 commitEditionStyle:forRowAtIndexPath:ここでのtableViewの私の実装です

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the row from the data source. 
     NSArray * keys = [userList allKeys]; 
     NSNumber *keyToRemove = [keys objectAtIndex:indexPath.row]; 
     NSLog(@"Key to remove: %@",keyToRemove); 
     NSLog(@"Object at key: %@",[userList objectForKey:keyToRemove]); 
      [userList removeObjectForKey:keyToRemove]; 
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [keys release]; 
     [keyToRemove release]; 

    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
    } 
} 

このメソッドが実行され、その後、私はエラーを取得します。 2つのNSLogステートメントは、正しいキーとそれに対応する値を出力します。

私が間違っていることを誰かに教えてもらえますか?あなたがそれらを解放するべきではありませんので、あなたは、keyskeysToRemoveを所有していない

おかげ

答えて

3

Cocoa memory management rulesを読むことを強くお勧めします。それは参照カウントはそれが必要以上に減少さですので、あなたは、それを割り当てられていない、それを保持し、またはそれをコピーしないにも関わらず、

[keys release]; 
[keyToRemove release]; 

あなたがリリースされているキーとkeyToRemove:

+0

おっと..彼らは割り当てられていない..私はそれを読んだ..単にばかだ。ありがとう! – Nick

+1

割り当てられていますが、割り当てられていません。 – EmilioPelaez

+0

私は理解しています... – Nick

1

はここにあなたの問題です。あなたがALLOCを呼び出した場合

一般的なルールとして、あなただけを保持(申し訳ありませんが、initはない)、またはそれにコピーし、オブジェクトを解放する必要があり、私はあなたがここに参照カウントに読んでお勧めします:Practical Memory Management

+0

これは、所有権を与えるメソッドの正しいリストではありません。それはやや複雑です(例えば、alloc ...で始まるメソッドです)、メモリ管理ルールを参照するのが最善ですが、基本的にNARCの 'new'、' alloc'、 'retain'、' copy'です。 – Chuck

+0

実際、それはタイプミスでした(リストは実際に最初の段落:/)。 – EmilioPelaez

関連する問題