Почему я получаю утечку памяти при добавлении кнопки в качестве подпредставления? - PullRequest
4 голосов
/ 22 февраля 2010

У меня есть приложение, которое использует табличное представление вместе с UIButton, которое я добавляю как подпредставление для каждой настраиваемой ячейки, например:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    checkButton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(2.0, 2.0, 40.0, 40.0)];
    [cell.contentView addSubview:checkButton];

    // lot's of other code

    return cell;
}

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

В частности, я получаю утечку памяти для каждой строки ячейки (каждый раз, когда кнопка добавляется как подпредставление), и утечкой объекта является "CALayer" с ответственным фреймом, являющимся "- [UIView _createLayerWithFrame:]".

Я что-то здесь не так делаю?

Ответы [ 3 ]

5 голосов
/ 22 февраля 2010

Метод code [UIButton buttonWithType] уже включает метод initWithFrame. Вам нужно просто использовать CGRectMake, а затем установить рамку кнопки.

rectangle = CGRectMake(2.0f,2.0f,40.0f,40.0f);
checkButton = [UIButton buttonWithType:UIButtonTypeCustom];
checkButton.frame = rectangle;
0 голосов
/ 22 февраля 2010

Является ли checkButton @property (сохранить) вашего класса?

Потому что в этом случае вы должны установить для свойства значение null после использования ... но вы не можете этого сделать, поскольку жизненный цикл ячейки не находится под вашим контролем; вам будет лучше с локальной переменной.

Кроме того, вы должны поместить [релиз checkButton] после addSubview, так как код addSubview самостоятельно сохраняет / выпускает

0 голосов
/ 22 февраля 2010

Вы проверяли это на физическом устройстве или на симуляторе ?

Известно, что симулятор имеет некоторые вариации управления памятью по сравнению с реальным кодом устройства. Вы должны всегда запускать тесты утечки памяти на реальном устройстве.

В противном случае ваш код выглядит правильно для меня.

...