我认为当我将视图添加为像这样的子视图时:
UIView* view = [[UIView alloc] init];
[self addSubview:view];
[view release];
之后释放视图是安全的......对于CALayer对象是否相同?如果我使用alloc / init创建CALayer,并执行:
[self.layer addSublayer:layer];
之后释放图层是否安全?
答案 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作为子图层添加到视图的主图层后释放它,你就会崩溃。或者至少我做了,我认为这是因为图层类方法将图层添加到自动释放池中,所以如果你自己发布它就会获得双版本,因此即使他认为主图层仍在使用它,它也会被释放。