Утечки памяти при удалении строки из таблицы

Я загружаю данные из 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]];

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

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


person lanan    schedule 04.05.2011    source источник


Ответы (2)


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

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];
person albertamg    schedule 04.05.2011
comment
причина утечки заключается в том, что init создает счетчик удержания, равный 1, а сохранение свойства также создает счетчик удержания, равный 1, что дает вам счетчик удержания, равный 2, когда вы ожидали только 1. утечка. - person Jason Cragun; 05.05.2011
comment
Спасибо за Ваш быстрый ответ! Я добавил autorelease для self.categories, но проблема все еще та же. К просочившимся объектам относятся: _NSCFDictionary и NSCFString. - person lanan; 05.05.2011
comment
@Shvetusya, вы показали нам, как вы создаете свой словарь и как вы удаляете из него объекты, но между ними вы должны использовать эти объекты для отображения данных в табличном представлении. Может быть, вы чрезмерно запоминаете эти объекты (просто предположение). - person albertamg; 05.05.2011
comment
Пришлось начинать проект заново, но разобрался! - person lanan; 05.05.2011
comment
@albertamg да, проблема была в промежуточном коде; в каждой категории был словарь элементов, и я неправильно расставил свойства элементов. Спасибо за помощь! - person lanan; 05.05.2011

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

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

self.categories = d;
[d release];
person Jason Cragun    schedule 04.05.2011