从tableview中删除行时内存泄漏

时间:2011-05-04 20:33:24

标签: iphone objective-c cocoa-touch memory-leaks

我正在将plist中的数据加载到我的应用程序中的tableview中。数据存储在可变字典的可变字典中。 这是我的viewDidLoad方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Categories";

    // load data from plist fle
    self.categories = [[[NSMutableDictionary alloc] initWithContentsOfFile:
                                  [[NSBundle mainBundle] pathForResource:@"InventoryItems" ofType:@"plist"]] autorelease];

    // add buttons to navigation menu
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
    self.navigationItem.leftBarButtonItem = self.addButton;
}

我的tableview是可编辑的,因此用户可以删除类别。在我的commitEditingStyle:forRowAtIndexPath:方法中,我更新了我的数据模型:

[self.categories removeObjectForKey: [[self.categories allKeys] objectAtIndex:indexPath.row]];

当我描述我的应用程序时,它会泄漏内存。我不是很精通使用配置文件工具,但每次删除行时,它似乎都会在我的类别字典中发现泄漏。

我想知道我错过了什么?我要删除的对象是否也是一个问题,我也需要删除它的对象?

2 个答案:

答案 0 :(得分:3)

这种泄漏(如果财产被保留或复制):

self.categories = [[NSMutableDictionary alloc] initWithContentsOfFile:
                                  [[NSBundle mainBundle] pathForResource:@"InventoryItems" ofType:@"plist"]];

请改用:

categories = [[NSMutableDictionary alloc] initWithContentsOfFile:
                                  [[NSBundle mainBundle] pathForResource:@"InventoryItems" ofType:@"plist"]];

或者这个:

self.categories = [[[NSMutableDictionary alloc] initWithContentsOfFile:
                                  [[NSBundle mainBundle] pathForResource:@"InventoryItems" ofType:@"plist"]] autorelease];

答案 1 :(得分:0)

我想知道这会给你带来什么不同吗?

NSMutableDictionary *d = [[NSMutableDictionary alloc] initWithContentsOfFile:
                                  [[NSBundle mainBundle] pathForResource:@"InventoryItems" ofType:@"plist"]];

self.categories = d;
[d release];