Objective-C内存管理--返回对象时的最佳实践?

Objective-C内存管理--返回对象时的最佳实践?,objective-c,memory-management,Objective C,Memory Management,假设我有这样一个函数: - (NSSet *) someFunction { //code... return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease]; } - (NSSet *) someFunction { //code... return [[NSSet alloc] initWithObjets:obj1, obj2, nil]; } 调用此函数时,是否需要保留/释放返回

假设我有这样一个函数:

- (NSSet *) someFunction {
    //code...
    return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease];
}
- (NSSet *) someFunction {
    //code...
    return [[NSSet alloc] initWithObjets:obj1, obj2, nil];
}
调用此函数时,是否需要保留/释放返回值?我想是的

但是,如果我不执行自动释放,那么someFunction现在看起来是这样的:

- (NSSet *) someFunction {
    //code...
    return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease];
}
- (NSSet *) someFunction {
    //code...
    return [[NSSet alloc] initWithObjets:obj1, obj2, nil];
}
在这种情况下,我假设我需要释放但不保留返回值

我的问题是,对于这种情况,建议/最佳做法是什么?是否推荐someFunction的一个或另一个版本?谢谢。

通常,我遵循这个“方式”


在返回对象之前释放该对象,该对象将在到达调用对象之前解除分配。这将产生一个错误。通过使用自动释放池来避免此错误。最初由可可公司的斯科特·史蒂文森介绍给我。这是他和许多人对Obj-C1.0的首选方式。

你应该花些时间阅读

简而言之,如果您通过以“alloc”或“new”开头的方法获取引用,或者包含“copy”,则您拥有该引用,而不必保留它。您必须通过直接发布或使用自动释放来提供其发布

如果您以任何其他方式(通过类方法或其他方式)获得引用,那么您不拥有引用,因此不必发布。如果你想保留参考资料,你必须保留它


总的来说,这是非常简单和有效的

在第二个示例中,您应该编写代码的唯一原因是如果您的方法名以new、alloc、create、copy或类似的名称开头

否则,您将负责释放(或自动释放)您分配的任何对象。第一个例子是做大多数事情的正确方法


如果调用函数希望该值持续超过函数作用域,则应保留该值,但它随后负责在某个时间点释放该值。

它是alloc,而不是init,这意味着您拥有引用我相信是的,您是正确的。编辑原始响应以反映这一点(为了子孙后代的缘故)。我看到很多ppl引用了该编程指南。读起来非常枯燥乏味。需要有另一个指南来指导it@Hisoka:是的,只是没有足够的性或毒品,对吧?@SK9不!没有药物,我没有幸福通常情况下,方法名称的第一个字母不应该是大写字母,除非它是通用缩写(例如HTTPBody,URL)。