2009-07-31 65 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的確切的規則,當你需要保留/釋放對象上。

對象將「消失」(即,被釋放)時,其上的所有所有制已經被放棄。也就是說,當(或不久之後)所有的分配/複製/新呼叫已經與釋放/自動釋放呼叫平衡。