Почему - [NSObject retainCount] иногда возвращает неожиданные значения? - PullRequest
1 голос
/ 22 сентября 2009

В табличном представлении: cellForRowAtIndexPath:

// 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

1 Ответ

3 голосов
/ 22 сентября 2009

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

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

Итак, опять основное правило: Не смотрите на retainCount .

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

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