例如,字符串是从NSDictionary
返回的,后者又从文件系统中读取它
因此,我们不知道字符串是通过[NSString stringWith...]
还是[[NSString alloc] initWith...]
或以其他任何方式创建的。
如果API未提及退货对象,您通常如何知道是否负责释放退货对象?
PS我在这里看到过类似的问题,但主要是处理常量@""
或明确创建的字符串。
答案 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:
访问字典的成员,因此您不负责发布它们。字典是此示例中您直接创建的唯一对象。如果您是通过alloc
,copy
或new
方法(例如[[NSDictionary alloc] initWithContentsOfFile:…]
)执行此操作,则必须将其释放。如果它来自其他地方,包括[NSDictionary dictionary…]
工厂之一,你没有引用它,也不需要发布它。