iPhone:使用retain vs autorelease

时间:2011-07-23 20:54:27

标签: iphone objective-c

哪一种更好的做法?

A)稍后自己保留并释放物品

NSMutableArray* array = [[self getArray] retain];
....
[array release];

B)从返回对象的函数中自动释放

getArray {
   NSMutableArray* returnedArray = [[[NSMutableArray alloc] init] autorelease];
   .....
   return returnedArray;
}

4 个答案:

答案 0 :(得分:4)

关于Objective-C中的内存管理,最简单的经验法则是你应该释放你明确分配(alloc),复制(复制),newed up(新)或保留(retain)的任何东西。

释放应在上述行动的范围内完成。如果为方法返回的对象分配空间,则应在返回之前自动释放它。因此,考虑到您提供的两个选项,B是推荐的做法。

答案 1 :(得分:2)

如果要返回对象,则必须使用第二种方法。在可能的情况下,您应该使用retain-release方法,因为这会占用更少的内存。

答案 2 :(得分:1)

您可以在内存managementperformance上阅读并遵循Apples指南。

我个人认为选择一种方式的原因是:

使用Autorelease专业人士:

  • 你不能把它搞砸,记忆会在某些时候被释放。我想将其视为“陷入成功的陷阱”。

缺点:

  • 使用autorelease可能会导致内存问题,因为很多对象都会等待自动释放池释放。

使用retain / release pros:

  • 使用/释放内存时的更多控制。
  • 在ios上,Apple建议您尽可能使用release而不是autorelease来保持池的大小。

缺点:

  • 与C / C ++ malloc / free new / delete一样,你必须小心保持它们的匹配,并且很容易填满它,导致内存泄漏。
  • 对于成员变量,您别无选择,保留/释放就是它。

我认为,无论您选择哪种风格,都取决于您的代码所处的情况,并根据专业人士和骗局选择最佳风格。我认为没有任何一个答案。

答案 3 :(得分:0)

  1. 如果您newalloc initretaincopy(NARC)是对象,则必须将其释放。
  2. 当方法的名称以任何单词开头时,表示正在为调用者创建它,调用者在完成对象时有责任release该对象。
    否则返回的方法不归调用者所有,他必须表明他希望让它在对象上调用retain
  3. 如果您可以选择,请不要在内存受到关注时滥用自动释放。
  4. 一些意见:

    • 第一条规则逻辑上导致第二条规则。示例:如果函数的结果(返回的对象)在执行函数后仍然存在,则所有函数都可以自动释放对象。
    • 除非存在内存/性能问题,否则自动内存管理的开销优于内存泄漏机会加上增加的开发时间。
    • 尝试对称保留/释放。示例:如果您保留在init上,则在dealloc上发布。对于viewDidLoad / viewDidUnload也是如此。
    • 如果使用@property(retain),则必须以dealloc发布。

    示例:

     // created with autoreleased, just call retain if you intend to keep it
     NSString *orange = [NSString stringWithString:@"orange"];
     // created for the caller, you'll have to release it when you are done
     NSObject *apple = [NSString initWithString:@"apple"];