0

我开始更好地理解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];

我不确定那里会发生什么,当它释放 nothing 时,但说该属性已经有一个值,我们设置它。在 setter 中,它首先被释放。所以这不是让它消失吗?如果它的引用计数为 1,然后在 setter 中释放它,它如何保持设置为保留的新值?

谢谢!!

4

3 回答 3

6

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

阅读诸如指针值之类的内容可能很有用。

于 2009-07-31T14:55:13.927 回答
0

myLabel 的初始值为 nil,所以你第一次分配给属性,即

self.myLabel = tempLabel;

将释放 nil,即 [nil release]。在 Objective C 中,向 nil 发送消息是无操作的,所以这不会做任何事情。

同样,在您的 dealloc 方法中,您应该具有:

[myLabel release];

如果该属性已被分配,它将释放 myLabel,平衡 setter 中的 [newValue retain]。如果该属性从未被分配,那么它仍然是 nil,并且 [nil release] 将再次成为空操作。

阅读内存管理规则,了解何时需要保留/释放对象的确切规则。

当对象的所有所有权都被放弃时,该对象将“消失”(即,被解除分配)。也就是说,当所有 alloc/copy/new 调用与 release/autorelease 调用平衡时(或不久之后)。

于 2009-08-01T02:39:00.230 回答
-2

我对 Objective-C 也比较陌生,但想尝试回答这个问题以再次确认我的理解。

假设我第一次设置我的属性,它还没有被分配,所以它的引用计数是 0,对吧?

是的,保留计数为 0。

在 setter 中,它首先被释放。所以这不是让它消失吗?

它从 的保留计数中减去 1 myLabel。如果 myLabel 的保留计数达到 0,则myLabel变量指向的数据或对象将从内存中释放。

如果它的引用计数为 1,然后在 setter 中释放它,它如何保持设置为保留的新值?

在这种情况下,myLabel指向的数据将被释放(保留计数将为 0),myLabel然后将指向 nil(它为空)。该变量在类中设置,并且始终可用于接受该设置器的消息,因此可以将新数据分配给的保留计数是 0 还是 100 myLabelmyLabel

于 2009-07-31T14:55:20.683 回答