2009-09-22 2 views
1

В Tableview: cellForRowAtIndexPath:Почему [NSObject retainCount] иногда возвращает неожиданные значения?

// Make a cell: 
UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:@"Default"] autorelease]; 

// Make a spinner: 
UIActivityIndicatorView *spin = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
// [spin retainCount] = 1 

// Start spinning 
[spin startAnimating]; 

[cell.contentView insertSubview:spin atIndex:0]; 
// [spin retainCount] = 3. Huh? 
// I would have expected it to be 2 at this point. 

[spin release]; 
// [[cell.contentView.subviews objectAtIndex:0] retainCount] = 2 

На данный момент я бы подумал cell.contentView.subview является единственным объектом с удержания на блесны. Но, очевидно, показатель сохранения 2 указывает на то, что что-то еще его удерживает. Может ли кто-нибудь объяснить мне, кто является объектом тайны, который имеет удержание на счетчике помимо массива subview cell.contentView?

Приветствие,

Doug

ответ

3

Объект тайны, которая сохраняет ваш кок (и много о других объектах) называется NSAutoreleasePool.

В Какао совершенно бесполезно смотреть на объекты retainCount, так как вы не можете знать, был ли объект сохранен - ​​автореализован раньше (часто много раз). Столбец saveCount будет уменьшаться только после того, как текущий пул будет слит, как правило, после следующего прохода через цикл запуска. Если вы не сохраните объект, он будет удален, когда пул будет удален.

Итак, основное эмпирическое правило: Не смотрите на saveCount.

Если было autoreleaseCount метод можно было бы вычислить «логический» сохранить счетчик, но я боюсь, что инженеры компании Apple оставили это в качестве упражнения для начинающих разработчиков какао;)

+0

На самом деле, для объектов I» m not autoreleasing, preserveCount никогда не ошибался для меня. Я использовал его часто и надежно. Я не уверен, что согласен с вашей оценкой в ​​общем случае, но в этом конкретном случае я думаю, что вы, вероятно, правы. UITableView и UITableViewCell подходят ко всякой хитрости под капотом. – dugla

+1

Вам не нужно самостоятельно проверять объекты, это может быть некоторый код, который не под вашим контролем. Cocoa и Cocoa-Touch используют автореализованные объекты повсюду. Например, синтезированные геттеры (атомных, сохраняющих) свойств делают это, чтобы гарантировать, что объекты будут живы при возврате геттера. И есть другие места, которые, я уверен, вы не знаете. –

Смежные вопросы