我有一个NSMutableDictionary作为我的UITableView的数据源。我正在尝试实现删除模式并遇到问题。
我正在记录我要删除的密钥以及它对应的对象,因为这个问题似乎可能与我尝试访问未分配的内存或其他内容有关。这是我的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语句输出正确的密钥及其对应的值。
有人能告诉我我做错了吗?
由于
答案 0 :(得分:3)
您不拥有keys
或keysToRemove
,因此您不应该发布它们。我强烈建议您阅读Cocoa memory management rules。
答案 1 :(得分:1)
这是你的问题:
[keys release];
[keyToRemove release];
您正在释放密钥和keyToRemove,即使您从未分配过它,保留它或复制它,因此它的引用计数正在下降超过应有的数量。
作为一般规则,如果您调用alloc,保留(不是初始化,抱歉)或复制它,您应该只释放一个对象,我建议您在此处阅读引用计数:{{3 }}