CALayer addSublayer увеличивает удержание счетчика? - PullRequest
2 голосов
/ 21 февраля 2009

Я думаю, что когда я добавляю представление в качестве подпредставления, вот так:

UIView* view = [[UIView alloc] init];
[self addSubview:view];
[view release];

что потом можно безопасно освободить представление ... это то же самое для объекта CALayer? Если я создаю CALayer, используя alloc / init, и делаю:

[self.layer addSublayer:layer];

Безопасно ли впоследствии делать слой?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2009

Да. В общем, если объект A нуждается в объекте B, он обязан сохранить его. Так что если «self.layer» нужен «слой», он будет поднимать retainCount во время addSublayer: и освобождает слой, когда он больше не нужен. Хотя есть некоторые исключения, эти исключения, как правило, очень хорошо документированы.

0 голосов
/ 21 февраля 2009

Прежде всего, вы создаете новый объект CALayer, используя метод класса layer, а не alloc / init. Вот так: -

CALayer *l = [CALayer layer];
l.frame = CGRectMake(...);
l.position = CGPointMake(...);
l.anchorpoint = CGPointMake(0,0);
l.contents = (id)someCGImageRef;
[self.layer addSublayer:l];

Во-вторых, это то место, где вы можете открепиться, потому что если вы отпустите CALayer после добавления его в качестве подслоя к основному слою вашего представления, вы получите сбой. Или, по крайней мере, я сделал, и я думаю, что это потому, что метод класса layer добавляет слой в пул автоматического выпуска, поэтому, если вы выпускаете его самостоятельно, вы получаете двойной релиз, и он освобождается, даже если он все еще использует его.

0 голосов
/ 21 февраля 2009

Я согласен с Луи. И хотя в этом случае это не является действительно необходимым, учтите, что вы всегда можете использовать метод retainCount:, чтобы дважды проверить эти вещи в будущем. Например:

NSLog(@"Retain count before: %d", [layer retainCount]);
[self.layer addSublayer:layer];
NSLog(@"Retain count after: %d", [layer retainCount]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...