目标 C NSString 保留

Posted

技术标签:

【中文标题】目标 C NSString 保留【英文标题】:objective C NSString retain 【发布时间】:2010-04-05 00:13:39 【问题描述】:

如果我使用 [NSString StringWithFormat] 创建一个字符串,我必须[保留] 它吗? 我的理解是方便的方法将对象添加到自动释放池中。如果是这种情况,我们是否应该保留该对象,以便它不会在事件循环结束时被池耗尽?

【问题讨论】:

【参考方案1】:

如果字符串应该在当前函数之外持续存在,那么是的,需要它的对象应该保留它。这是英语措辞看似微不足道但实际上隐藏了一个关键概念的地方之一。而不是说“我必须保留它吗?”或(正如我最初写的)“如果您希望字符串持久存在”,则用保留字符串的对象来说话。不同之处在于后者表达了ownership 的概念(注意:Apple 文档在谈到所有权时使用“you”,但它是第三人称中性“you”而不是第二人称“you”)。当然,如果您将字符串存储在property 中,那么会为您处理保留(或复制)。除非您需要针对旧版本的 OS X(10.4 和更早版本),否则您通常应该使用属性。

标准集合拥有它们包含的对象,因此保留它们。当一个元素从集合中移除时,集合会释放该元素(注意:它们不会自动释放,因此如果对象没有其他所有者,则该对象将被销毁)。在“Validity of Shared Objects”中阅读有关此主题的更多信息。 Apple 的 memory management 文档应该会告诉您您需要知道的一切。

【讨论】:

非常感谢 outis。我是一名 java 程序员,因此所有权等概念还不太自然:) 另一个相关问题,如果我创建 NSString 的 NSArray(使用 [new]),那么,我不需要保留 NSString 是否正确不再,因为它现在归我所有的 NSArray 所有。因此,如果我正确地保留/释放我的 NSArray,它包含的 NSStrings 将始终由我隐式保留/释放。我们假设我要求 NSArray 及其成员 NSStrings 在整个应用程序生命周期中都可用。 @Amarsh:关于 NSArray 的正确性。更新后的答案提供了更多细节。 再次感谢outis。同一上下文中的另一个问题。我按如下方式添加一个对象: [someNSArray addObject:[SomeClass alloc]] 和稍后调用: [someNSArray removeAllObjects] 在这种情况下,我的 SomeClass 对象会自行释放吗?我的基本困惑是,在我们分配一个对象并将其添加到集合的情况下,谁是所有者、集合或您……或两者兼而有之? @Amarsh:分配 SomeClass 的集合和对象或函数都将拥有它。你真的应该阅读我链接到的内存管理文档;它首先用内存管理的基本规则回答了这个问题。此外,在调用alloc:[someNSArray addObject:[[SomeClass alloc] init]] 之后,您应该始终调用init 方法,否则您最终会得到一个已分配空间但未填写的对象。 init 方法类似于 Java 中的构造函数。

以上是关于目标 C NSString 保留的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]

在视图控制器之间传递NSString中的数据 - 目标C [重复]

为啥需要保留 NSString 变量?

如何增加 NSString 类型变量的保留计数? [复制]

保留和释放 nsstring

[NSMutableDictionary setValue: value forKey: key] 是不是保留 NSString 键?