将消息发送到已发布的对象?

时间:2011-12-19 00:34:16

标签: iphone objective-c cocoa-touch cocoa

我有几个遵循以下设置模式的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}}进行财产更改。我没有抱怨。我只是想了解原因。

编辑:我应该补充说这些是实例变量,如果这有所不同。

4 个答案:

答案 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)

因为它们可能在......之前保留。