泄漏:
+ ( 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];
希望我很清楚......:)
答案 0 :(得分:2)
第一个示例中出现泄漏警告的原因是由于命名约定。通常,以new
开头的类方法应返回保留对象,并且大多数其他类方法应返回自动释放的对象。由于您的方法不是以new
开头,而是返回保留对象,因此分析器会认为您要泄漏对象。这里的解决方案是为您的方法提供更好的名称,例如:
+ (MyDetails *) newMyDetails;
还有一些你没有遵循的其他约定(你可能应该这样做)。
init
开头的方法都是初始值设定项。它应该是一个实例方法,它应该返回self
或另一个初始值设定项的结果。阅读Apple's documentation,了解如何正确创建init方法。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时,它会没事的。