我开始在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中,它如何保持设置为保留的新值?
谢谢!
答案 0 :(得分:6)
我认为你混淆了对象和引用。属性是对象的引用,而不是对象本身。当您设置或取消设置属性时,它会向其指向的对象发送保留和释放,但引用本身是属性所在对象的一部分(在本例中为self)。
答案 1 :(得分:0)
myLabel的初始值为nil,因此您首次分配给该属性,即
self.myLabel = tempLabel;
将发布nil,即[nil release]。在Objective C中,向nil发送消息是一种无操作,因此这将不起作用。
同样,在你的dealloc方法中,你应该有:
[myLabel release];
如果已分配属性,将释放myLabel,从而在setter中平衡[newValue retain]。如果从未分配过属性,那么它仍然是零,并且[nil release]将再次成为无操作。
阅读memory management rules,了解有关何时需要保留/释放对象的确切规则。
当对象的所有权已被放弃时,该对象将“消失”(即,被取消分配)。也就是说,当所有alloc / copy / new调用与释放/自动释放调用平衡时(或之后不久)。
答案 2 :(得分:-2)
我对Objective-C也比较陌生,但我想尝试回答这个问题,以重申我的理解。
说我第一次设置我的属性,它还没有被分配,所以它的引用数是0,对吗?
是的,保留计数为0。
在setter中,首先它被释放。那不是让它消失吗?
它从保留计数myLabel
中减去1。如果myLabel的保留计数达到0,则myLabel
变量指向的数据或对象将从内存中释放。
如果它的引用计数是1,然后在它发布的setter中,它如何保持设置为保留的新值?
在那种情况下,指向的数据myLabel
将被释放(保留计数将为0),然后myLabel
将指向nil(它为空)。该变量在类中设置,并始终可用于接受该setter的消息,因此可以将新数据分配给myLabel
myLabel
的保留计数是0还是100。