我有几个遵循以下设置模式的UIView子类(按钮,标签等)。我的问题是,为什么在UILabel
之后仍然可以将邮件发送到release
?
myLabel = [[UILabel alloc] initWithFrame:someFrame];
[someUIView addSubview:myLabel];
[myLabel release];
myLabel.textAlignment = UITextAlignmentCenter;
// other property changes to myLabel
我认为它们是由新的UIView“拥有”的,但我不明白为什么release
不会破坏原始对象,从而破坏所有消息。我没有通过someUIView
的{{1}}进行财产更改。我没有抱怨。我只是想了解原因。
编辑:我应该补充说这些是实例变量,如果这有所不同。
答案 0 :(得分:3)
只要保留计数大于0,就不会销毁对象。在这种情况下,someUIView
保留了对象。
最好不要在释放后访问对象。更好的模式可能是:
myLabel = [[[UILabel alloc] initWithFrame:someFrame] autorelease];
myLabel.textAlignment = UITextAlignmentCenter;
[someUIView addSubview:myLabel];
myLabel = nil;
第二个例子:
myLabel = [[UILabel alloc] initWithFrame:someFrame];
[someUIView addSubview:myLabel];
myLabel.textAlignment = UITextAlignmentCenter;
// other property changes to myLabel
[myLabel release];
myLabel = nil;
答案 1 :(得分:1)
您仍然可以向标签发送消息,因为标签尚未发布。 -addSubview:
保留传入的对象,因此对象保留在内存中,因为视图仍然保持引用,并且您没有使myLabel
指针无效。
答案 2 :(得分:1)
拨打-addSubview:
时,标签上的-retain
会拨打-release
。此时,您放弃所有权(通过调用{{1}})并且只有视图拥有它。但它仍然存在,直到包含视图也释放它。
答案 3 :(得分:0)
因为它们可能在......之前保留。