Утечки памяти при удалении строки из таблицы - PullRequest
0 голосов
/ 05 мая 2011

Я загружаю данные из plist в таблицу в моем приложении. Данные хранятся в изменчивом словаре изменяемых словарей. Вот мой метод 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;
}

Моя таблица доступна для редактирования, поэтому пользователь может удалять категории. В моем commitEditingStyle: forRowAtIndexPath: метод я обновляю свою модель данных:

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

При профилировании приложения происходит утечка памяти. Я не очень опытен в использовании инструмента профиля, но кажется, что я обнаруживаю утечки в моем словаре категорий каждый раз, когда я удаляю строку.

Интересно, где я что-то пропустил? Является ли проблемой то, что объект, который я удаляю, также является словарем, и мне тоже нужно удалить его объекты?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Это утечка (если свойство сохраняется или копируется):

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];
0 голосов
/ 05 мая 2011

Интересно, это даст тебе что-нибудь другое?

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

self.categories = d;
[d release];
...