【问题标题】:Return Statement Creates and Release an ObjectReturn 语句创建和释放对象
【发布时间】: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 库的共同点

标签: iphone objective-c ios object return


【解决方案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]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2013-09-14
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2015-05-12
      相关资源
      最近更新 更多