Objective-C内存管理 - 返回对象时的最佳实践?

时间:2009-03-28 03:13:01

标签: objective-c memory-management

假设我有这样的功能:

- (NSSet *) someFunction {
    //code...
    return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease];
}

当我调用此函数时,是否需要保留/释放返回值?我假设我这样做。

但是,如果我不进行自动释放,那么someFunction现在看起来像这样:

- (NSSet *) someFunction {
    //code...
    return [[NSSet alloc] initWithObjets:obj1, obj2, nil];
}

在这种情况下,我假设我需要释放但不保留返回值。

我的问题是,对于这些情况,建议/最佳做法是什么? someFunction的一个或另一个版本是推荐的吗?感谢。

3 个答案:

答案 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或类似名称开头。

否则,您负责释放(或自动释放)您分配的任何对象。第一个例子是做大多数事情的正确方法。

如果调用函数希望它继续通过函数作用域,则该函数应该保留该值,但是它稍后负责释放它。