2009-07-31 68 views
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]; 

我真的不知道会发生什么在那里,当它释放什么,但说该属性已有一个值,我们设置它。在制定者中,首先获得释放。那么这不会消失吗?如果它的引用计数是1,然后在引用计数器中它被释放,那么它是如何保持被设置为保留的新值的?

谢谢!

回答

6

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

阅读诸如pointerslvalues之类的内容可能很有用。

+0

由于这是有道理的。 – mk12 2009-07-31 15:03:08

-2

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

说我第一次设置我的属性,它尚未分配,所以它的引用计数为0,对不对?

是,保留计数为0

在二传手,首先它得到释放。那么这不会消失吗?

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

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

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

+0

从技术上讲,最好不要去想绝对保留计数,而是认为你是否有在对象的所有权股份。如果一个对象的保留计数达到0,它将取消分配。自动释放对象(其中可能有保留1计数,后来下降到0)比你在你的第一点解释什么不同。正如Louis指出的那样,ivars(变量/引用)没有保留计数 - 对象的确存在。 – 2009-07-31 21:09:50

0

myLabel的初始值为零,所以你的第一个属性,即

self.myLabel = tempLabel; 

将释放nil,即[零释放]。在Objective C中,向nil发送消息是无操作的,所以这将无能为力。

同样,在你的dealloc方法,你应该有:

它会释放出myLabel如果属性曾经被分配,在二传手平衡了[NEWVALUE保留。如果该属性从未被分配过,那么它仍然是零,并且[无释放]将再次成为无操作。

阅读memory management rules的确切的规则,当你需要保留/释放对象上。

对象将“消失”(即,被释放)时,其上的所有所有制已经被放弃。也就是说,当(或不久之后)所有的分配/复制/新呼叫已经与释放/自动释放呼叫平衡。