【问题标题】:Memory Management with method calls带有方法调用的内存管理
【发布时间】:2012-10-03 08:06:53
【问题描述】:

我有一个关于 Objective-c 中的内存管理和方法调用的非常简单的问题。

想象一下我有:

- (void)someFunction
{
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Value 1", nil];
    [self someOtherFunction:array];
}

- (void)someOtherFunction:(NSMutableArray *)array
{
    // Should I retain array here?
    [array addObject:@"Value 2"];
    // And then release ?
}

这是一个简单的示例,但假设我们有 10 个具有相同对象参数的方法调用。 最好的解决方案是什么?

【问题讨论】:

  • what 问题的最佳解决方案?
  • @trojanfoe 在我的代码中阅读了我的评论 :) 不,我没有使用 ARC。

标签: objective-c ios memory-management memory-leaks


【解决方案1】:

如果您是所有的皮带和大括号,或者正在用线程做很多奇怪的事情,那么您可能应该在每个方法调用中保留/释放。事实上,这正是 ARC 在幕后为您所做的。 (据我所知,它没有记录在案,并且可能会因版本而异。)

当然,按照您的建议保留/释放不会造成任何伤害。在实践中,它不太可能增加太多开销。

说了这么多:大多数人添加保留/释放。如果您的代码都在主线程上运行,那么在您执行方法时您的对象不太可能被释放。

【讨论】:

    【解决方案2】:

    (这解释了禁用 ARC 时的引用计数)

    使用便捷构造函数时,返回的对象作为自动释放对象返回。

    自动释放意味着在当前运行循环结束时,对象的引用计数将减 1。如果对象从创建到此时未保留,则意味着它将被释放。

    这意味着在您的代码中您不需要添加任何保留/释放调用,因为该对象将一直存在到您的 someFunction 方法结束。

    如果在您的 someFunction 方法结束时,您需要保持数组存在,例如在实例变量中,您可以使用:

    _myInstanceVar = [array retain]; // don't forget to release it in dealloc method
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多