Return 语句创建和释放对象

Posted

技术标签:

【中文标题】Return 语句创建和释放对象【英文标题】:Return Statement Creates and Release an Object 【发布时间】:2012-05-09 18:08:44 【问题描述】:

我正在处理别人的代码。我以前从未遇到过这样的事情:

return [[[NSObject alloc] init] autorelease];

谁能告诉我这意味着什么以及为什么有人会使用它?为了清楚起见,我不是在问自动释放部分。我会对这段代码有同样的疑问:

-(id)someMethod

lots of lines of code
...
return [[NSObject alloc]init];

【问题讨论】:

简单回答:使用 ARC,您再也不用担心这个问题了。 那是完全错误的,理查德。使用 ARC,您仍然必须了解 Objective-C 内存管理的工作原理,但是一旦您了解了,您就不必做那么多体力劳动了。 也许在该方法中返回nil 是为了表示错误而保留的,他们想返回不同的东西以获得成功,但并不真正关心什么。不管怎样,糟糕的设计。 ...或者他们可能想要返回不响应来自某些协议的任何选择器的东西。给定一行几乎毫无意义的代码是不可能的。 @Lvsti 从消息/函数返回一个对象并不一定表明设计不好,这是一些 Cocoa/Touch 和 Foundation 库的共同点 【参考方案1】:

自动释放功能表明你想在未来释放这个对象,但不是现在,因为你仍然需要访问它。随着释放周期和内存池的释放,自动释放是内存管理中非常有用的工具。 您可以参考:http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447 了解有关自动发布的信息。 这是一个链接! What is the difference between releasing and autoreleasing? 希望这有帮助!

【讨论】:

【参考方案2】:

正在分配、初始化对象,然后将其添加到autorelease pool。

引用 Apple 文档(上面的链接):

自动释放池提供了一种机制,您可以通过该机制向对象发送 “延迟”发布消息。这在您 想放弃一个对象的所有权,但想避免 它被立即释放的可能性(例如当你 从方法返回一个对象)。通常,您不需要创建 您自己的自动释放池,但在某些情况下 要么你必须这样做,要么这样做是有益的。

TL;DR 如果没有人很快会retain 该对象,它将在run loop 的下一次迭代中释放。

如果不知道任何细节,很难说为什么有人要首先分配一个 NSObject。我建议在项目中搜索该方法的使用示例,然后看看该对象接下来会发生什么。

【讨论】:

【参考方案3】:

为了方便,它只是返回一个自动释放的对象。这意味着当您使用该功能时,一般来说您不必在其上附加autorelease 消息。您可能总是希望自动释放某些对象。

例如,Objective-C 中包含的许多便利(“工厂”)方法返回一个自动释放的对象。你可能熟悉[NSString stringWithFormat:__FORMAT__],它返回一个自动释放的NSString。看看http://memo.tv/archive/memory_management_with_objective_c_cocoa_iphone

作为一个函数可能返回对象的示例,请考虑一个同步 URL 请求,您可能关心也可能不关心响应,或者类似以下的函数:

- (NSString *)modifyObject:(MyObject *)o 
    o.mySettableProp = @"MODIFIED!";
    return [o description];

【讨论】:

为什么要在函数中返回一个新创建的对象?这行代码是在一个多行长函数之后? 例如,一个同步的 URL 请求通常会返回一个 URL Response 对象。您可能关心也可能不关心响应(通常您会关心,但也许您只是在黑暗中开枪)。所以你可以选择[request send]response = [request send]

以上是关于Return 语句创建和释放对象的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏

怎样理解构造函数中的return语句

避免使用“return”语句复制对象

Python函数基础--def及return语句地操作

C语言中return语句怎样返回两个或多个值

javascript-函数的参数和return语句