2011-07-01 83 views
0

我有一個NSMutableDictionary作爲我的UITableView的數據源。我正在嘗試執行刪除模式並遇到問題。從NSMutableDictionary中刪除對象時出現EXC_BAD_ACCESS錯誤

我正在記錄我試圖刪除的密鑰以及它對應的對象,因爲這個問題似乎可能與我嘗試訪問未分配的內存有關。這裏是我的tableView實現:commitEditionStyle:forRowAtIndexPath:

- (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. 
    } 
} 

此方法運行,然後我得到的錯誤。兩條NSLog語句輸出正確的密鑰並且它是相應的值。

有人能告訴我我做錯了什麼嗎?

感謝

回答

3

你不擁有keyskeysToRemove,所以你不應該將他們釋放。我強烈建議閱讀Cocoa memory management rules

+0

哎呀..他們從來沒有分配..我讀過它..只是愚蠢的。謝謝! – Nick

+1

他們正在分配,但不是由你。 – EmilioPelaez

+0

我明白... – Nick

1

這是你的問題:

[keys release]; 
[keyToRemove release]; 

您正在釋放鍵和keyToRemove,即使你從未被分配過它,它保留或複製它,所以它的引用計數減少超過它應該。

作爲一般規則,你應該只釋放對象,如果你叫頁頭,保留(未初始化,不好意思)或複製就可以了,我建議你參考這裏閱讀計數:Practical Memory Management

+0

這不完全是賦予所有權的方法的正確列表。它有點複雜(例如,它是從'alloc ...'開始的任何方法),最好只涉及內存管理規則,但它基本上是NARC--「new」,「alloc」,「retain」和「copy」。 – Chuck

+0

事實上,這是一個錯字(第一段實際上是正確的:/)。 – EmilioPelaez

相關問題