Разработка под iOS: как я неправильно управляю памятью в этом коде? - PullRequest
2 голосов
/ 03 декабря 2010

Я только что добавил некоторый код, взятый из Apple Docs , который показывает, как использовать пользовательские UITableViewCells, созданные из пера. Я новичок в разработке для iOS, поэтому я все еще учусь правильному управлению памятью, и код не совсем понятен для меня, как он работает в первую очередь. Когда я запускаю инструмент Allocations, он показывает нераспределенную память в коде ниже. В частности, он показывает, что UITableViewCells остаются живыми после того, как контроллер представления извлечен из стека навигации ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    static NSString *CellIdentifier = @"MyCustomCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil];  //<--Allocations instrument complaining about this line
        cell = customCell;
        [self setCustomCell:nil];
    }

    return cell;
}

customCell - это экземплярная переменная, определенная в этом контроллере представления, например ...

IBOutlet UITableViewCell *customCell;
@property (nonatomic, retain) IBOutlet UITableViewCell *customCell;

Есть ли проблема в этом коде?

Большое спасибо за вашу мудрость!

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

Я сравнил код из документации:

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];
    cell = tvCell;
    self.tvCell = nil;
}

С вашим кодом:

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil];
    cell = [self customCell];
    [self setCustomCell:nil];
}

Кажется, есть несоответствие в строке, где вы назначаете cell.Пример кода Apple использует tvCell, переменную экземпляра , тогда как вы используете [self customCell], метод получения свойства для переменной экземпляра .Может ли это быть причиной?Попробуйте изменить

    cell = [self customCell];

на

    cell = customCell;
1 голос
/ 03 декабря 2010

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

Я думаю, что происходит то, что ваш контроллер вида не выпускается.В ObjectAlloc вы видите, что ячейки таблицы все еще сохраняются, потому что они, в свою очередь, удерживаются вашим табличным представлением, которое, в свою очередь, удерживается вашим контроллером представления ...

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

Или, возможно, но более вероятно, что вы не освобождаете свое табличное представление.В ObjectAlloc после того, как вы покинете контроллер представления, я бы проверил, находится ли сам контроллер представления также в памяти.

0 голосов
/ 04 декабря 2010

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

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