关于NSObject类/保留计数的简单问题

时间:2011-05-29 04:17:59

标签: iphone

如果我使用返回NSMutableArray的方法创建一个NSObject类,我是否需要在类中释放数组或者类是否永远保留?

不确定如何解释所以这里有一些代码:

@implementation PointsClass

- (NSMutableArray *)pointsForLevel 
{
NSMutableArray *_points = [NSMutableArray new];

   [_points addObject:[NSValue valueWithCGPoint:CGPointMake(521, 279)]];
   [_points addObject:[NSValue valueWithCGPoint:CGPointMake(321, 491)]];
   [_points addObject:[NSValue valueWithCGPoint:CGPointMake(419, 477)]];

return _points;
}

@end

如果我从这样的ViewController中调用此方法:

PointsClass *pointsClass = [PointsClass new];
NSMutableArray *points = [pointsClass pointsForLevel];
[pointsClass release];

我只需要发布指针数组吗? 是否保留了_points数组?

2 个答案:

答案 0 :(得分:2)

new会为你提供一个保留计数为1的对象。所以,是的,你需要在某处释放它。

这里的约定是返回[_points autorelease],然后让调用者决定是否需要保留数组一段时间。

答案 1 :(得分:0)

Apple's Memory Management Programming Guide(你绝对应该阅读)总结得最好:

  • 您只能发布或自动发布 你拥有的物品。
  • 如果您拥有对象的所有权 你使用一个方法创建它 名称以“alloc”,“new”开头, “复制”,或“mutableCopy”(for 例如,alloc,newObject或 mutableCopy),或者如果你发送它 保留信息。
  • 您使用发布或自动发布 放弃对象的所有权。 autorelease只是意味着“发送一个 将来发布消息“ (具体来说:使用时 自动释放池接收排水 消息 - 了解何时会这样做 是,请参阅“自动释放池”)。

因为您使用“new”创建了它,所以您有责任释放它。我建议改为:

  • 在返回之前自动释放_points。然后呼叫者可以决定是否保留它,或者......
  • 重命名您的方法以反映由它返回的对象必须释放的事实(如newPointsForLevel)。

此外,您正在创建PointsClass的实例(通过new),而不是将其分配给变量。那是内存泄漏。

其他一些指示:

  • alloc / init通常比new更受欢迎,尽管它们在功能上是相同的。有关该主题的更多信息,请参阅here
  • 我不建议使用前导下划线命名局部变量 - 通常为实例变量保留。