2010-05-04 49 views
0

如果我有一個實例方法,並在此方法中我做這樣的事情:的Objective-C:當不分配的對象得到釋放

NSString *peopleString = [peopleList componentsJoinedByString: @", "]; 
... 
UILabel *likeLabel = [[UILabel alloc] initWithFrame:CGRectMake(16.0+6.0f, 4.0f, 252.0f, 12.0f)]; 
[likeLabel setText:peopleString]; 
[likeLabel setFont:[UIFont fontWithName:@"Arial" size:12]]; 
[likeRow addSubview:likeLabel]; 
[likeLabel release]; 

componentsJoinedByString不包含newcopyalloc,因此我不必釋放它。我想知道的是,當我的peopleString被取消分配時。可能會發生早?意思是,在我可以在我的標籤中設置文字之前。我應該更好地使用[[NSString alloc] initWithString:[peopleList componentsJoinedByString: @", "]];並在此方法結束時發佈它嗎?

回答

1

當您創建peopleString它得到的1引用計數以後,當你告訴likeLabel使用peopleString其文本的peopleString引用計數加1。現在對於peopleString引用計數爲2。當likeLabel是大概在事件循環結束時,引用計數peopleString減1。但您的peopleString實例也通過事件循環結束時將其引用計數減1。因此peopleString現在有一個引用計數爲0並從內存中刪除。

請參閱#6578以獲得更好的解釋。

+0

感謝您的回答,並指出我#6578 – znq 2010-05-05 09:48:22

1

自動釋放的對象(如「peopleString」在你的代碼)被自動釋放池(NSAutoreleasePool),當「」方法被調用釋放。
AppKit在事件循環的每個循環中創建一個自動釋放的池,並在最後耗盡它。
所以,當你正在執行代碼(例如在一個方法中)時,這些對象將不會被釋放。

+0

使用自動釋放池(可能會累積成爲一個很大的開銷)有一個小的開銷,所以一般來說,非常鬆散,最好使用alloc/init,然後釋放。但是:我很少打擾。 – 2010-05-04 15:12:00

+0

或者,您可以創建NSAutoreleasePool的其他實例。這樣,直到事件循環結束時對象纔會累積,並且您正在保存一些性能,因爲所有對象都將同時被釋放。 :) – Macmade 2010-05-04 15:19:39

+0

感謝您的回答/評論Macmade和Paul。 – znq 2010-05-05 09:49:00