在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?

Posted

技术标签:

【中文标题】在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?【英文标题】:Is AutoRelease redundant when using ARC in Objective-C? 【发布时间】:2012-04-02 21:53:57 【问题描述】:

我对 Objective-C 还是很陌生,正如你所知道的,直到最近,我还没有真正理解对所有这些 AutoRelease 恶意软件的需求。我认为这主要是因为我已经使用 ARC 开始了 Objective-C,并且没有接触过保留和释放。

无论如何,我现在的理解是,在 ARC 之前,如果你创建了一个对象并需要返回一个指向它的指针作为方法/函数的返回对象,你需要自动释放它,因为你无法做到执行“return obj;”后的“[obj release]”

担心保留和释放不是 ARC 的问题。这是否意味着在我们自己的代码中,创建我们自己的自动释放对象真的有意义吗?即,做[[[Class alloc] init] autorelease]?根据我的收集,我们仍然应该设置自动释放池,但这只是因为其他框架或库可能仍然返回自动释放对象,但我们不再需要自己显式创建自动释放对象 - 这是一个公平的理解吗?

谢谢, 尼克

【问题讨论】:

在 ARC 编译的代码中调用 autorelease 是非法的,对 retainrelease 的调用也是如此。 【参考方案1】:

使用 ARC 时,您不想自己进行任何内存管理。具体来说,您不会调用 release 和 auto release,因为它会为您完成这一切。事实上,如果您尝试自己管理内存,编译器可能会抱怨。

您只需调用 [[Class alloc] init]; 而不是 [[[Class alloc] init] autorelease];

我建议阅读此blog post,了解有关 ARC 和一般内存管理的一些非常好的背景知识。

【讨论】:

【参考方案2】:

嗯,你的理解是非常正确的。使用 ARC,我们不再发布或自动发布。只需确保我们将 nil (或其他一些合理的值)分配给我们不再需要的任何对对象的引用。在最坏的情况下,我们仍然可以不断消耗额外的内存,但内存不会泄漏任何矿石。

是的,为了使用可能不使用 ARC 的框架库(链接的),我们仍然维护自动释放池。

回答您关于自动释放目的的问题。当然,这仅适用于非 ARC 项目。 在过去的美好时光里,Objective-C 不提供任何引用计数,但它的保留计数。未保留(或保留计数为 0)的任何已分配对象内存都被认为是空闲的,并且可能很快被其他对象声明和使用。 这意味着每个对象在分配后都需要保留,假设您想保留它。当不再使用该对象时,您需要释放它。这有两个风险。好吧,alloc 确实会自动保留它一次。 1)您可能忘记释放未使用的对象。在最坏的情况下,您甚至可能会丢失对永远留在内存中的对象的所有引用。 2) 您可能仍然引用已经释放的对象,然后尝试访问它,这很可能以 BAD_EXC 异常结束。

所有这些都可能很烦人。为了摆脱那些不会长时间存在的对象的这些义务,发明了自动释放。仅对于临时对象,您分配它(release-count = 1)并自动释放它。这意味着该对象将在下一个自动释放周期内自动释放(保留计数减 1)。但是该对象在执行时仍然为您的方法分配。通常,参考变量是本地变量。

示例:

-(void) myMethod

AClass *someObject = [[[AClass alloc] init] autorelease];

// use the object

// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject:

// don't care any more


在使用 ARC 时不再需要这些。

【讨论】:

以上是关于在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C内存管理之ARC

Objective-C内存管理之ARC

Objective-C中,ARC下的 strong和weak指针原理解释

如何实现与 ARC 兼容的 Objective-C 单例?

Objective-c的内存管理MRC与ARC

尽管标记了文件 -fno-objc-arc,但 ARC 禁止在结构或联合中使用 Objective-C 对象