2011-05-29 59 views
0

如果我用一个返回一个NSMutableArray的方法创建一个NSObject类,是否需要释放类中的数组还是该类永远不会保留?关于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 

如果我叫从视图控制器这种方法是这样的:

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

难道我只需要释放的指针数组? _points数组是否已被保留?

回答

2

新会给你一个保留数为1的对象。所以,是的,你需要在某个地方平衡一下这个版本。

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

+0

感谢Firoze,这是我的问题。如果我使用_points = [[NSMutableArray new] autorelease];我的应用程序崩溃。 – EcksMedia 2011-05-29 04:56:45

+0

@EcksMedia Firoze是正确的。调用[pointsClass pointsForLevel]传递自动释放的NSMutableArray。所以现在,只要需要,来电者必须保留它。可能您可以添加更多代码来查看点变量实际使用的位置? – marcus 2011-05-29 06:44:37

0

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

  • 你只释放或自动释放你自己 对象。
  • 你拿,如果 您使用其 名称以“黄金”的方法创建一个对象的所有权,“新”, “复制”,或“mutableCopy”(对于 例如,分配,NEWOBJECT,或 mutableCopy),或者如果您发送一个 保留消息。
  • 您使用release或autorelease来放弃对象的所有权。 自动释放只是意味着 “在未来发送 释放消息”(具体:当使用 自动释放池接收漏极 消息理解时,这将是 ,请参见“自动释放池”)。

因为您使用“新”创建它,所以您有责任将其释放。我会建议,而不是以下之一:

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

另外,您正在创建PointsClass的一个实例(通过new),并且不将它分配给一个变量。这是内存泄漏。

几个其它指针:

  • 分配/初始化通常优于新,尽管它们在功能上是相同的。有关该主题的更多信息,请参阅here
  • 我不推荐使用前导下划线命名局部变量 - 通常保留用于实例变量。
+0

感谢您的回应,我完全理解,如果我创建了一个对象,您需要释放它,但是在此示例中我遇到的问题是要释放的问题? Autorelease崩溃我的应用程序。我正在考虑通过dealloc释放我认为可能是正确的事情。另外,感谢提供关于未将PointsClass分配给var的提示,我已经在我的代码中纠正了这一点,并将在上面的示例中进行说明。 – EcksMedia 2011-05-29 05:17:19