假设我有这样的功能:
- (NSSet *) someFunction {
//code...
return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease];
}
当我调用此函数时,是否需要保留/释放返回值?我假设我这样做。
但是,如果我不进行自动释放,那么someFunction现在看起来像这样:
- (NSSet *) someFunction {
//code...
return [[NSSet alloc] initWithObjets:obj1, obj2, nil];
}
在这种情况下,我假设我需要释放但不保留返回值。
我的问题是,对于这些情况,建议/最佳做法是什么? someFunction的一个或另一个版本是推荐的吗?感谢。
答案 0 :(得分:12)
你应该花些时间阅读Memory Management Programming Guide for Cocoa。
简短的说法是,如果您通过一个以'alloc'或'new'开头或包含'copy'的方法获得您的引用,那么您拥有该引用并且不必保留它。您可以通过直接发布或使用自动释放来提供释放。
如果你以任何其他方式获得引用(通过类方法或者你有什么),你就没有引用,所以你不必发布。如果你想保留一个参考,你必须保留它。
总而言之,这非常简单有效。
答案 1 :(得分:2)
嗯...
通常情况下,我会遵循这种“方式”。
+ (id)MyObj {
return [[[MyObj alloc] init] autorelease];
}
在返回对象之前释放该对象,该对象在到达调用对象之前将被释放。这将产生错误。请使用自动释放池来避免此错误。最初由Theocacao的Scott Stevenson介绍给我。对于Obj-C 1.0来说,这是他的许多首选方式。
答案 2 :(得分:2)
在第二个示例中,您应该执行代码的唯一原因是您的方法名称以new,alloc,create,copy或类似名称开头。
否则,您负责释放(或自动释放)您分配的任何对象。第一个例子是做大多数事情的正确方法。
如果调用函数希望它继续通过函数作用域,则该函数应该保留该值,但是它稍后负责释放它。