内存泄漏与最佳对象释放实践

时间:2011-03-09 00:49:43

标签: objective-c xcode ipad

泄漏:

 + ( 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];

希望我很清楚......:)

3 个答案:

答案 0 :(得分:2)

第一个示例中出现泄漏警告的原因是由于命名约定。通常,以new开头的类方法应返回保留对象,并且大多数其他类方法应返回自动释放的对象。由于您的方法不是以new开头,而是返回保留对象,因此分析器会认为您要泄漏对象。这里的解决方案是为您的方法提供更好的名称,例如:

+ (MyDetails *) newMyDetails;

还有一些你没有遵循的其他约定(你可能应该这样做)。

  1. 任何以init开头的方法都是初始值设定项。它应该是一个实例方法,它应该返回self或另一个初始值设定项的结果。阅读Apple's documentation,了解如何正确创建init方法。
  2. 班级名称始终以大写字母开头。您的班级应该命名为MyDetails

答案 1 :(得分:1)

Q1:“initEmptySlideDetails”是一个功能很差的名称,因为它很可能被误认为是你的类的初始值设定项。如果您将方法命名为以“alloc”或“new”开头,或者将其命名为包含“copy”一词,那么您不应该自动发布它。否则你应该。至少如果你想关注Apple's standard memory management rules

Q2:自动释放的对象可以在当前方法中使用,传递给其他方法,也可以从当前方法返回。但是如果没有保留,它将无法保存。注意保留可能是隐含的,例如如果将其分配给声明为“retain”的属性,或将其添加到NSArray,NSDictionary,NSSet或保留其成员的其他集合中。此外,如果你搞乱了可能导致早期释放对象的NSAutoreleasePool。

答案 2 :(得分:0)

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

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

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

尝试setupEmptySlideDetails或makeEmptySlideDetails。

修改

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

Q2

你不需要留在那里。 Autorelease意味着对象将在您的方法结束后的某个未来日期发布。 (可能很快或可能是几秒钟后)。 与此同时,当你使用myDetails时,它会没事的。