【问题标题】:Class method that returns object and transfers ownership返回对象并转移所有权的类方法
【发布时间】:2011-01-26 02:14:49
【问题描述】:

[这是内存管理说明/问题]

  • 我有一个返回 NSMutableArray* 的类方法。
  • 我希望调用者拥有它并且必须调用释放。
  • 我不想使用 AutoRelease,因为我希望它在调用者完成后立即从内存中释放出来。

只要我以 new 或 alloc 开头的名称就可以这样做,对吗?

例如

+ (NSMutableArray*) newArrayFromDB
{
  NSMutableArray* myArray = [[NSMutableArray alloc] init];
  //stuff to populate array
  return myArray;
}

然后调用者将调用:

 NSMutableArray* test = [ThatClass newArrayFromDB];
  //use test
  [test release];

静态分析器似乎认为没问题...但我想要第二个意见...

感谢您的任何反馈....

【问题讨论】:

  • 你为什么要这个?是什么让这个案例如此特别?
  • 我没有意识到(正如大卫指出的那样)默认的自动释放池在每次通过主循环时都会被耗尽。我错误地认为,直到游泳池本身超出范围,它才被排干。我现在很高兴返回一个 Autoreleased NSMutableArray。

标签: objective-c


【解决方案1】:

是的,您所做的是正确的 - 您正确地遵循了 object ownership policy 中的规则。

我可能会质疑的唯一一点是I don't want to use AutoRelease because I want it freed from memory as soon as caller is done。每次通过主运行循环时,默认的自动释放池都会被耗尽,因此在大多数情况下,内存很快就会被释放。而且,如果调用者需要尽快强制释放,它总是可以手动分配/排出自动释放池。当然,一种方法是创建两个方便的方法+ newArrayFromDB:+arrayFromDB;一种自动释放,一种不自动释放。

【讨论】:

  • 我没有意识到每次通过主运行循环时自动释放池都被耗尽了——这很有意义。我想我要切换到返回一个自动释放的数组。感谢您的帮助:-)
【解决方案2】:

是的,这就是这样做的方法。

我可能会使用“create”这个词来表示调用者拥有所有权,但我猜 new 也可以。


附言如果你想提高一点速度,使用 allocWithZone:NULL 比 alloc 快一点。

【讨论】:

  • 使用new*代替create*符合内存管理规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多