-
06-07-2019 - |
题
我开始在objective-c中更好地理解内存管理,但有些东西我不明白。这是一个财产声明:
@property (nonatomic, retain)UILabel *myLabel;
这是它看不见的合成二传手(我认为):
- (void)setMyLabel:(UILabel *)newValue {
if(myLabel != newValue) {
[myLabel release];
myLabel = [newValue retain];
}
}
这节省了你每次保留和填充的所有工作,但是我说我第一次设置我的属性,它还没有被分配,所以它的引用数是0,对吗?所以我做了
UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];
我不确定那里会发生什么,当它什么都没发布时,但是说该属性已经有了值,我们设置了它。在setter中,首先它被释放。那不是让它消失吗?如果它的引用计数是1,然后在它发布的setter中,它如何保持设置为保留的新值?
谢谢!
其他提示
myLabel的初始值为nil,因此您首次分配给该属性,即
self.myLabel = tempLabel;
将发布nil,即[nil release]。在Objective C中,向nil发送消息是一种无操作,因此这将不起作用。
同样,在你的dealloc方法中,你应该有:
[myLabel release];
如果已分配属性,将释放myLabel,从而在setter中平衡[newValue retain]。如果从未分配过属性,那么它仍然是零,并且[nil release]将再次成为无操作。
阅读内存管理规则关于何时需要保留/释放对象的确切规则。
该对象将“消失”。 (即,当所有的所有权都被放弃时,被解除分配)。也就是说,当所有alloc / copy / new调用与释放/自动释放调用平衡时(或之后不久)。
我对Objective-C也比较陌生,但我想尝试回答这个问题,以重申我的理解。
说我第一次设置我的属性,它还没有被分配,所以它的引用数是0,对吗?
是的,保留计数为0。
在setter中,首先它被释放。那不是让它消失吗?
它从 myLabel
的保留计数中减去1。如果myLabel的保留计数达到0,则 myLabel
变量所指向的数据或对象将从内存中释放。
如果它的引用计数是1,然后在它发布的setter中,它如何保持设置为保留的新值?
在那种情况下,指向的数据 myLabel
将被释放(保留计数将为0),然后 myLabel
将指向nil(它为空)。变量在类中设置,并始终可用于接受到该setter的消息,因此可以将新数据分配给 myLabel
,无论 myLabel
的保留计数是否为0或100。