Меня интересует поведение класса 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 к максимуму.Чтобы доказать, что это не просто проблема с числом, я использовал второй выпуск.Слой будет освобожден из памяти только после второго выпуска.
Поведение этого также может быть вызвано автоматическим выпуском.
Итак, почему сообщение в слой увеличивает количество сохраняемых данных?Я пропустил какую-то информацию о проблемах с сохранением и выпуском?
Заранее спасибо
Марко