【问题标题】:Memory leak versus best object release practice内存泄漏与最佳对象释放实践
【发布时间】:2011-03-09 00:49:43
【问题描述】:

泄漏:

 + ( myDetails* ) initEmptySlideDetails { //ok
    myDetails* theObject = [[myDetails alloc] init];
    theObject.ID = 0;
    return theObject;
}

问题 1:这是返回一个我也想释放的对象以避免内存泄漏的正确方法吗?

没有泄漏:

+ ( myDetails* ) initEmptySlideDetails { //ok
        myDetails* theObject = [[myDetails alloc] init];
        theObject.ID = 0;
        return [theObject autorelease];
    }

问题2:当我使用对象时,是否需要强制保留? (因为自动释放)。

myDetails* myDetails = [myDetails initEmptySlideDetails];

希望我很清楚... :)

【问题讨论】:

    标签: objective-c xcode ipad


    【解决方案1】:

    在第一个示例中您收到泄漏警告的原因是命名约定。通常,以new 开头的类方法应返回保留对象,而大多数其他类方法应返回自动释放对象。由于您的方法不是以new 开头但您返回的是一个保留对象,因此分析器认为您将泄漏一个对象。这里的解决方案是给你的方法一个更好的名字,比如:

    + (MyDetails *) newMyDetails;
    

    还有一些您没有遵守的其他约定(您可能应该遵守)。

    1. 任何以init 开头的方法都是初始化器。它应该是一个实例方法,它应该返回self 或另一个初始化程序的结果。阅读Apple's documentation,了解如何正确创建 init 方法。
    2. 类名总是以大写字母开头。你的班级应该命名为MyDetails

    【讨论】:

    • 非常感谢。因此,据我了解,以“新”开头的方法重命名是一种更好的做法。并且不关心返回“return [theObject autorelease];” ?
    • 是的。调用您的newMyDetails 方法的人将成为返回对象的所有者并负责释放它。
    【解决方案2】:

    Q1:“initEmptySlideDetails”是一个糟糕的函数名称,因为它很可能被误认为是您的类的初始化程序。如果您将方法命名为以“alloc”或“new”开头,或者将其命名为包含“copy”一词,则不应自动释放它。否则你应该。至少如果你想关注Apple's standard memory management rules

    Q2:自动释放的对象可以在当前方法中使用,传递给其他方法,并且可以从您当前的方法返回。但是如果没有保留,它就不能保存以备后用。请注意,保留可能是隐含的,例如如果您将其分配给声明为“保留”的属性或将其添加到 NSArray、NSDictionary、NSSet 或其他保留其成员的集合中。另外,如果你弄乱了 NSAutoreleasePool 可能会导致对象被提前释放。

    【讨论】:

      【解决方案3】:

      如果您使用上述代码显示泄漏,则说明有问题。第一组代码是正确的。

      你怎么知道有泄漏?仪器?静态分析?

      您可能将静态分析器与您选择的前缀 init 混淆了。

      尝试 setupEmptySlideDetails 或 makeEmptySlideDetails。

      编辑

      现在第二组代码是正确的。

      第二季度

      你不需要保留在那里。自动释放意味着对象将在您的方法结束后的某个未来日期释放。 (可能很快,也可能在几秒钟后)。 同时,当您使用 myDetails 时,一切都会好起来的。

      【讨论】:

      • 抱歉,我已经反转了泄漏并且没有泄漏示例,已更正。
      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 2012-01-25
      • 2012-02-05
      • 2012-06-08
      • 2011-04-27
      • 2021-05-21
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多