Почему это представление NIB не публикуется до возвращения? - PullRequest
2 голосов
/ 31 июля 2010
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];
if (cell == nil) 
    {
    [[NSBundle mainBundle] loadNibNamed:@"ThemeCell" owner:self options:nil];
        cell = self.themeCell;
        self.themeCell = nil;
}
...
return cell;

Насколько я понимаю, self.themeCell = nil; должен уничтожить объект, поскольку у него больше нет владельца.cell = self.themeCell не сохраняет его, а просто назначает.Так что же поддерживает клетку?Я могу только предположить, что синтезированное свойство автоматически высвобождает старое значение вместо немедленного его освобождения.Это тот случай?

Ответы [ 2 ]

2 голосов
/ 31 июля 2010

Процесс загрузки пера немного (но не очень) сложен и отличается для платформ OSX и iPhone. Вы можете прочитать об этом в разделе жизненного цикла объекта Nib в Руководстве по программированию ресурсов. В таблице 1-1 вы найдете это:

Объекты в файле пера созданы со счетом сохранения 1, а затем autoreleased. Как это восстанавливает иерархия объектов, однако, UIKit восстанавливает связи между объекты, использующие setValue: forKey: метод, который использует доступные метод установки или сохраняет объект по умолчанию, если нет метода установки доступно

Так что получается, что ячейка создается с счетом сохранения 1, а затем, когда она устанавливается с помощью синтезированного сеттера, она увеличивается до 2. Когда вы устанавливаете свойство на nil, счет сохранения уменьшается до 1, и ячейка возвращается в табличное представление. Табличное представление добавляет его в свою иерархию представлений и тем самым сохраняет его (и, возможно, сохраняет его и в других частях своей логики). После всего этого пул autorelease сливается.

Я могу только предположить, что syntesized собственность автоматически выпускает старый значение вместо выпуска, это случай

Нет, синтезированные сеттеры немедленно освобождают объект. (Хотя некоторые каркасные классы могут удерживать объект немного дольше, если это представление, например, необходимо анимировать.)

0 голосов
/ 31 июля 2010

AFAIK, синтезированные свойства используют release, а не autorelease.

Может случиться так, что в ячейке есть делегат или что-то подобное, указанное в NIB, который сохраняет право собственности, или что-то в вызове loadNibNamed:owner:options: устанавливает автоматическое освобождение объекта, который все еще ожидает рассмотрения.Поставьте NSLog(@"Retain Count: %d", [cell retainCount]); до и после self.themeCell=nil; для проверки.

...