2010-04-05 64 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