Объект просочился: выделенный объект не упоминается позже в этом пути выполнения и имеет счет сохранения +1 - PullRequest
0 голосов
/ 14 марта 2012

У меня возникает утечка памяти, когда я пытаюсь сбросить табличное представление, я думал, что могу просто поставить релиз раньше, но это не помогает.

Что мне здесь делать?

-(void) resetTable{

    recordOffset = 10;
    rOFactor = 0;
    booShowMoreCell = false; 
    self.transactionsArray = [[NSMutableArray alloc] init]; // leak here
}

Ответы [ 3 ]

5 голосов
/ 14 марта 2012

Если предположить, что TransactionsArray - это сохраняемое свойство, проблема заключается в том, что NSMutableArray сохраняется дважды.

Когда вы устанавливаете сохраненное свойство, оно освобождает старое значение и сохраняет новое (входящее) значение. Метод alloc также сохраняет объект.

Итак

//   \/--- retain count = 2               \/-- retain count = 1
self.transactionsArray = [[NSMutableArray alloc] init];

Кратчайший способ решения этой проблемы - это автоматическое освобождение NSMutableArray:

self.transactionsArray = [[[NSMutableArray alloc] init] autorelease];

Для вышеприведенной строки есть удобный способ:

self.transactionsArray = [NSMutableArray array];
0 голосов
/ 14 марта 2012

С первого взгляда я бы сказал, что вы просто перезаписываете указатель ссылкой на новый объект и забываете старую ссылку, которая указывает на объект, который еще не был освобожден.Пока вы не используете ARC, вы должны использовать

[self.transactionsArray release]; // Be sure it was alloced before
self.transactionsArray = [[NSMutableArray alloc] init];
0 голосов
/ 14 марта 2012

Поскольку я не вижу [tableView release] -колл в этом коде, вот чего не хватает - вы не выпускаете tableView до того, как выделите новый поверх него. Это означает, что вы добавляете счет сохранения, не удаляя его первым. Добавление release исправит утечку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...