путаница в сохранении и выпуске вопросов - PullRequest
0 голосов
/ 09 мая 2011

Меня интересует поведение класса CALayer и его счетчика ссылок.Пожалуйста, посмотрите следующие два фрагмента кода:

Первый:

CALayer *layer = [[CALayer alloc] init];
NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 1
[layer release]; // no problem so far

[layer release]; // this leads to a crash as expected

Второй:

CALayer *layer = [[CALayer alloc] init];

NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 1
layer.opaque = YES; //increases the retain count, WHY?!?
NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 2

[layer release]; // no problem so far

[layer release]; // this leads NOT to a crash as expected

В первом фрагменте все происходит так, как я ожидаю, такжепадение (зомби ...) во втором сообщении о выпуске.

Во втором сообщении происходят неожиданные вещи.Вызов любого сообщения после init (например, layer.opaque = YES) увеличивает счетчик удержания на единицу, но только на первый вызов сообщения.Таким образом, счетчик удержания всегда 1 к максимуму.Чтобы доказать, что это не просто проблема с числом, я использовал второй выпуск.Слой будет освобожден из памяти только после второго выпуска.

Поведение этого также может быть вызвано автоматическим выпуском.

Итак, почему сообщение в слой увеличивает количество сохраняемых данных?Я пропустил какую-то информацию о проблемах с сохранением и выпуском?

Заранее спасибо

Марко

Ответы [ 2 ]

1 голос
/ 09 мая 2011

retainCount бесполезен. Не называй это.

Итак, почему сообщение на слой увеличить его сохранить количество? Я скучал некоторая информация о сохранении и проблемы с выпуском?

Потому что это внутренняя деталь реализации каркаса.

Если вы уравновешиваете свои удержания и выпуски, то ваши объекты будут правильно освобождены.

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

1 голос
/ 09 мая 2011

Вы пропустили часть о неиспользовании счетчика сохранения для отладки.Не делай этого.Счет сохранения объекта - не ваше дело.

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

Если объект остается на месте после того, как вы правильно выполнили цикл сохранения / выпуска, это означает что-то ещевладеет им и несет ответственность за его освобождение.Если вы отпустите его снова, вы нарушите это право собственности, которое может закончиться только трагически.

Так что, если layer.opaque = YES увеличивает количество сохраняемых объектов, пусть это так.Не беспокойся об этом.Вы выполнили свое обязательство, и если вы делаете что-то еще, это нарушит цикл сохранения / освобождения в другом месте.

...