我应该发布我没有创建的NSString实例吗?

时间:2011-02-03 14:29:10

标签: objective-c nsstring

例如,字符串是从NSDictionary返回的,后者又从文件系统中读取它 因此,我们不知道字符串是通过[NSString stringWith...]还是[[NSString alloc] initWith...]或以其他任何方式创建的。

如果API未提及退货对象,您通常如何知道是否负责释放退货对象?

PS我在这里看到过类似的问题,但主要是处理常量@""或明确创建的字符串。

4 个答案:

答案 0 :(得分:3)

不,您应该只发布您alloc',retain',copy'或new'的实例。

答案 1 :(得分:2)

请参阅Cocoa Memory Management Rules。如果你只能阅读文档的单个部分,那就是那个:)还有静态分析器(Build→Build and Analyze),它与内存管理规则相当不错,它应该能够捕获到什么你错过了。

答案 2 :(得分:1)

Objective-C经验法则:如果您的代码执行alloc / copy / retain来初始化对象,那么您需要释放它,因为您是所有者。如果您没有执行alloc / copy / retain来初始化对象(例如使用方法来获取实例),那么您不是所有者,不应该释放该对象。

在这种情况下,您没有创建字符串,因此您不负责释放它。您不必担心字符串在创建时被初始化并添加到NSDictionary中(除非您自己创建并将其添加到字典中)。对于大多数集合对象,它们拥有添加到它们的对象的所有权,因此它们负责释放它们所关注的对象。

答案 3 :(得分:1)

通过-objectForKey:访问字典的成员,因此您不负责发布它们。字典是此示例中您直接创建的唯一对象。如果您是通过alloccopynew方法(例如[[NSDictionary alloc] initWithContentsOfFile:…])执行此操作,则必须将其释放。如果它来自其他地方,包括[NSDictionary dictionary…]工厂之一,你没有引用它,也不需要发布它。