【问题标题】:Simple Question about NSObject class / Retain Count关于 NSObject 类/保留计数的简单问题
【发布时间】:2011-05-29 04:17:59
【问题描述】:

如果我使用返回 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 数组有没有保留?

【问题讨论】:

    标签: iphone


    【解决方案1】:

    new 将为您提供一个保留计数为 1 的对象。所以,是的,您确实需要在某处释放它与平衡它。

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

    【讨论】:

    • 感谢 Firoze,这就是我的问题所在。如果我使用 _points = [[NSMutableArray new]autorelease];我的应用崩溃了。
    • @EcksMedia Firoze 是正确的。调用 [pointsClass pointsForLevel] 会提供自动释放的 NSMutableArray。所以现在调用者必须在需要时保留它。也许您可以添加更多代码来查看 points 变量的实际使用位置?
    【解决方案2】:

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

    • 您只能释放或自动释放 您拥有的物品。
    • 如果满足以下条件,您将获得对象的所有权 您使用一种方法创建它 名称以“alloc”、“new”开头, “复制”或“可变复制”(对于 例如,alloc、newObject 或 mutableCopy),或者如果你发送一个 保留消息。
    • 您使用 release 或 autorelease 来 放弃对象的所有权。 autorelease 只是意味着“发送一个 未来发布消息” (具体:当使用 自动释放池接收到流失 消息——了解何时会 是,请参阅“自动释放池”)。

    因为您使用“新”创建它,所以您有责任发布它。我会推荐以下方法之一:

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

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

    其他几个指针:

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

    【讨论】:

    • 感谢您的回复,我完全理解如果我创建了一个对象,您需要释放它,但我在此示例中遇到的问题是在哪里释放?自动释放使我的应用程序崩溃。我正在考虑通过 dealloc 释放,我认为这可能是正确的做法。另外,感谢关​​于不将 PointsClass 分配给 var 的提示,我已经在我的代码中纠正了这一点,并将在上面的示例中进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2013-03-19
    相关资源
    最近更新 更多