Mem管理返回的局部变量

时间:2010-02-10 22:55:41

标签: iphone objective-c

当在方法中分配局部变量,然后返回给调用者时,我对保留/释放计数有点困惑。例如

-(NSMutableString*)foo { 
   NSMutableString *str = [[[NSMutableString alloc] init] autorelease];
   [str appendString:@"Just a test"];
   return str;
}

NSMutableString *myString = [self foo];

问题:(你可以看到我对此案感到困惑) 1.当str分配给myString时,str会保留计数增量吗? 2.在这种情况下自动释放是否安全? 谁应该清理记忆?

感谢。

3 个答案:

答案 0 :(得分:5)

我建议你阅读Cocoa memory management guidelines。你的所有问题都在那里得到解答。

回答这个特定的代码示例:它正确地管理内存。这就是autorelease的用途 - 你需要一个对象来粘贴特定的方法调用,但仍然会被释放。您基本上将所有权转为自动释放池。

保留和释放没有魔力。分配局部变量不会影响对象的保留计数 - 必须发送retainrelease才能实现。

答案 1 :(得分:2)

没有特别的魔法。

  • 当向对象发送retain消息时,其保留计数会增加。
  • 当向对象发送release消息时,其保留计数会减少。
  • 当向对象发送autorelease消息时,它会将自己添加到池中。
  • 当池耗尽时(可能在运行循环或线程结束时),该池中的任何内容都会发送release消息。
  • 当一个对象收到尽可能多release个消息的消息时(假设retain引起了隐式retain),该对象会发送一个{alloc消息1}}消息。

否则对象的保留计数不受影响(除非进行任何优化)。

答案 2 :(得分:1)

1)否

2)是的 - 这是这种情况的正确模式。 (您不希望调用者必须跟踪和释放此NSMutableString实例)

NSMutableString *str = [[NSMutableString alloc] init];
return str;

会很糟糕,因为你的调用者现在被迫管理返回的变量。