2010-04-05 76 views
1

如果我用[NSString StringWithFormat]創建一個字符串,是否必須[保留]它? 我的理解是,便利的方法將對象添加到自動釋放池。如果是這樣的話,我們不應該保留這個對象,以便它不會在事件循環結束時耗盡池中的內容。objective C NSString retain

回答

1

如果字符串應該持續超出當前函數,那麼是的,需要它的對象應該保留它。這裏是英語詞組似乎微不足道的地方之一,但實際上隱藏了一個關鍵概念。而不是說「我必須保留它嗎?」或者(正如我最初寫的那樣)「如果你想讓字符串保持,」用一個保留字符串的對象說話。不同之處在於後者表達了ownership的概念(注意:蘋果文檔在談到所有權時使用「你」,但它是第三人稱中性「你」而不是第二人稱「你」)。當然,如果您將字符串存儲在property中,則會爲您處理保留(或複製)。除非您需要定位舊版本的OS X(10.4和更早版本),否則您通常應該使用屬性。

標準集合擁有它們包含的對象,因此保留它們。當元素從集合中移除時,集合釋放元素(注意:它們不會自動釋放,因此如果對象沒有其他所有者,對象將被銷燬)。在「Validity of Shared Objects」中閱讀更多關於此主題的內容。蘋果公司的memory management文檔應該告訴你你需要知道的一切。

+0

非常感謝outis。我是一個Java程序員,因此所有權等概念不自然流暢:) 另一個相關的問題,如果我創建一個NSArray(使用[new])的NSString,那麼,是否正確,我不需要保留NSString,因爲它現在歸屬於我所擁有的NSArray。因此,如果我保留/正確釋放我的NSArray,它所包含的NSStrings將始終由我隱式保留/釋放。 我們假設我需要NSArray及其成員NSStrings在整個應用程序生命週期中都可用。 – Amarsh 2010-04-05 00:53:18

+0

@Amarsh:正確的關於NSArray。更新的答案提供了更多的細節。 – outis 2010-04-05 01:10:01

+0

再次感謝outis。在同樣的背景下的另一個問題。 我添加一個對象如下: [someNSArray addObject:[SomeClass alloc]] and later,call: [someNSArray removeAllObjects] 在這種情況下,我的SomeClass對象會自行釋放嗎? 我的基本困惑是,在我們分配一個對象並將其添加到集合的情況下,誰是所有者,集合還是您或兩者? – Amarsh 2010-04-05 01:52:16