CALayer addSublayer增加保留计数?

时间:2009-02-20 22:24:41

标签: objective-c iphone cocoa-touch

我认为当我将视图添加为像这样的子视图时:

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

之后释放视图是安全的......对于CALayer对象是否相同?如果我使用alloc / init创建CALayer,并执行:

[self.layer addSublayer:layer];

之后释放图层是否安全?

3 个答案:

答案 0 :(得分:6)

是。通常,如果对象A需要对象B,则对象A有责任保留它。因此,如果“self.layer”需要“layer”,它将在addSublayer:中释放retainCount,并在不再需要时释放layer。虽然有一些例外情况,但这些异常往往会有很好的记录。

答案 1 :(得分:0)

我同意路易斯。虽然在这种情况下并不是真的有必要,但请注意,您可以随时使用retainCount:方法仔细检查这些内容。例如:

NSLog(@"Retain count before: %d", [layer retainCount]);
[self.layer addSublayer:layer];
NSLog(@"Retain count after: %d", [layer retainCount]);

答案 2 :(得分:-2)

首先,使用图层类方法而不是alloc / init创建一个新的CALayer对象。像这样: -

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

其次,这是你可以解开的地方,因为如果你在将CALayer作为子图层添加到视图的主图层后释放它,你就会崩溃。或者至少我做了,我认为这是因为图层类方法将图层添加到自动释放池中,所以如果你自己发布它就会获得双版本,因此即使他认为主图层仍在使用它,它也会被释放。