我开始在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中,它如何保持设置为保留的新值?

谢谢!

有帮助吗?

解决方案

我认为你混淆了对象和引用。属性是对象的引用,而不是对象本身。当您设置或取消设置属性时,它会向其指向的对象发送保留和释放,但引用本身是属性所在对象的一部分(在本例中为self)。

阅读指针左值

其他提示

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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top