2010-08-25 82 views
0

在下面的代碼中,當tapsMessage被釋放或賦值運算符以某種方式遞增保留計數以使tapsLabel.text繼續可用時,將釋放tapsLable.text嗎?一個簡單的目標C xcode內存管理問題

NSString *tapsMessage = [[NSString alloc] initWithFormat:@"%d taps detected", numTaps]; 
tapsLabel.text = tapsMessage; // tapsLabel is a UILabel object 
[tapsMessage release]; 

回答

0

它不會被釋放。

1

tabsLabel.text是tapsLabel上的一個屬性。我認爲這是一個字符串屬性,可以在賦值時完成[target copy]。沒關係細節,是的,賦值操作符會增加保留計數或複製值,因此您可以釋放tapsMessage,它仍然可用於tapsLabel.text。

Read more about properties here.

編輯:擡頭的UILabel在頭,是的,它的文本屬性的副本。

@property(nonatomic,copy) NSString  *text;   // default is nil 

編輯:在評論上的重要問題展開

如何沒有人知道什麼時候發佈,什麼時候不,如果你要看看每個實施細節對象,你分配的東西至?

您只需遵循內存管理規則。 refcounted環境的要點正是在內存管理方面,對象之間存在一些「鬆散耦合」。只要您保留並正確發佈,只要所有相關方都保留併發布相匹配的內容,其他人是否也保留併發布了相同的對象並不是您的擔心。

+0

我是新來的Objective-C,但我知道C.如果賦值操作符有時會導致保留計數的副本或增量,有時它不會,這會使內存管理非常成問題。如何知道何時發佈以及什麼時候不發佈,以及如何查看每個分配給某個對象的實現細節? (只是好奇) – bhause 2010-08-25 05:23:43

+0

規則其實很簡單,一旦你習慣了。看到這裏:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmRules.html在你的例子retainCount for tapsMessage實際上不應該增加,因爲它是一個副本,而不是保留,操作。正如您在內存管理指南中所看到的,您不必查看實現細節以知道何時(不)發佈。 – Jaanus 2010-08-25 05:29:32

+0

感謝大家的幫助和患者。我認爲現在很清楚。 – bhause 2010-08-25 21:58:01

2

這裏有一個技巧

你可以寫爲對象的retainCounter那麼你看到它是什麼之前和分配之後。

例如NSLog(@"%d", [tapsMessage retainCount]);

這樣你可以在將來只需寫出retainCount來回答這些問題,因爲它總是取決於聲明的屬性。

+3

'retainCount'應該很少被明確地查看。事實上,文檔說不要使用'retainCount'方法來檢查內存管理問題。請參閱[這裏](http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#jumpTo_18)。 – dreamlax 2010-08-25 07:42:06

+0

@dreamlax我知道它不適用於調試,但它確實提供了有關引用計數如何工作的信息,這是OP正面臨的問題。 – 2010-08-25 12:02:43

+0

感謝retainCount記錄提示。我相信我會在未來使用它。我想我最初的困惑是因爲我沒有意識到賦值運算符「=」會導致調用存取方法。再次感謝您的幫助! – bhause 2010-08-25 22:09:12

1

在第一行中,您已分配並初始化一個NSString。您根據memory management rules擁有此對象,這意味着您有責任釋放它。

在第二行中,您將分配tapsMessage字符串text屬性。此屬性(假設tapsLabelUILabel)聲明爲copy屬性。對於不可變字符串(NSStrings),由於不需要進行實際的數據重複(數據永遠不會改變),因此詢問副本只會增加保留計數。由於UILabel製作了字符串的副本,因此它也聲明瞭所有權(對象可以擁有多個所有者)。

在第三行中,您放棄了您的所有權,但該字符串仍然有一個所有者(標籤),因此該對象不會被釋放。

+0

「對於不可變字符串(NSStrings),由於不需要進行實際的數據重複(數據永遠不會更改),因此詢問副本只需增加保留計數。」 - 偉大的洞察力。這是正式記錄的任何地方,這是如何工作的? – Jaanus 2010-08-25 19:02:03

+0

感謝您的幫助和解釋。我認爲現在對我來說都很清楚。 – bhause 2010-08-25 22:05:06