【发布时间】:2010-04-05 00:13:39
【问题描述】:
如果我使用 [NSString StringWithFormat] 创建一个字符串,我必须[保留] 它吗? 我的理解是方便的方法将对象添加到自动释放池中。如果是这种情况,我们是否应该保留该对象,以便它不会在事件循环结束时被池耗尽?
【问题讨论】:
标签: objective-c nsstring retain
如果我使用 [NSString StringWithFormat] 创建一个字符串,我必须[保留] 它吗? 我的理解是方便的方法将对象添加到自动释放池中。如果是这种情况,我们是否应该保留该对象,以便它不会在事件循环结束时被池耗尽?
【问题讨论】:
标签: objective-c nsstring retain
如果字符串应该在当前函数之外持续存在,那么是的,需要它的对象应该保留它。这是英语措辞看似微不足道但实际上隐藏了一个关键概念的地方之一。而不是说“我必须保留它吗?”或(正如我最初写的)“如果您希望字符串持久存在”,则用保留字符串的对象来说话。不同之处在于后者表达了ownership 的概念(注意:Apple 文档在谈到所有权时使用“you”,但它是第三人称中性“you”而不是第二人称“you”)。当然,如果您将字符串存储在property 中,那么会为您处理保留(或复制)。除非您需要针对旧版本的 OS X(10.4 和更早版本),否则您通常应该使用属性。
标准集合拥有它们包含的对象,因此保留它们。当一个元素从集合中移除时,集合会释放该元素(注意:它们不会自动释放,因此如果对象没有其他所有者,则该对象将被销毁)。在“Validity of Shared Objects”中阅读有关此主题的更多信息。 Apple 的 memory management 文档应该会告诉您您需要知道的一切。
【讨论】:
alloc:[someNSArray addObject:[[SomeClass alloc] init]] 之后,您应该始终调用init 方法,否则您最终会得到一个已分配空间但未填写的对象。 init 方法类似于 Java 中的构造函数。