免费,dealloc,release和autorelease之间有什么区别?

18
有人能解释一下free()releaseautoreleasedealloc之间的区别吗?
3个回答

21

free()是C语言的一个函数,用于释放通过malloc()或其他已记录需要使用free()来释放内存的函数获得的不再需要的内存,例如strdup()

-dealloc是Objective-C选择器,当对象不再是应用程序的任何部分所拥有时,Objective-C运行时会向对象发送此选择器。

-release是您发送给对象的选择器,以指示您放弃对该对象的所有权。一旦没有任何人拥有该对象,运行时将向其发送-dealloc消息。

-autorelease是您发送给对象的选择器,以指示您放弃对该对象的所有权。但是,如果现在没有任何人拥有该对象,则最终的-dealloc将被推迟到某个未指定的稍后时间点。实际上,你正在将所有权转移给一个自动释放池,该池在被释放(或排空)时将释放它。

除了在对象自己的-dealloc方法中向super发送之外,绝不能向对象发送-dealloc


3
在Objective-C中,你通常只会使用releaseautorelease这两种方法。当你使用C时,可能会使用free,否则应该使用releaseautoreleasedealloc不应被任何代码调用,因为它会干扰Objective-C所使用的保留/释放生命周期来跟踪资源。如果你使用dealloc,几乎肯定会在运行时崩溃。
有关于使用releaseautorelease的最终资源,可以查看Apple内存管理文档

3
  • free 是 C 语言中与 malloc 相对应的函数。在 Objective C 编程中,你可能不会经常使用它。
  • 如果你拥有一个对象,在使用完后需要调用 release 方法将其释放。
  • 你也可以使用 autorelease 方法来自动释放对象,它会在当前运行循环结束时释放对象。
  • 当一个对象的引用计数降为零时,运行时会调用 dealloc 方法。你不应该自己调用这个方法。

如果你使用了 allocnewretaincopy 方法来创建一个对象,那么你就是这个对象的所有者。

Apple 提供了一些关于内存管理的优秀文档


1
点3:我会称其为“运行循环迭代”,而不是“运行循环”。 点4:当然,你是想说“dealloc”而不是“release”,对吧?(抱歉,我有点龟毛) - Dirk
非常感谢。那绝对有帮助。 - ar106
1
我认为你需要更仔细地阅读你链接的文档。你不拥有一个你init的对象,你拥有一个你用newalloc或包含单词copy的方法创建的对象。你还拥有一个你保留的对象。 - JeremyP
1
此外,自动释放的对象可能无法持续到运行循环迭代结束。它只会持续到自动释放池被清空为止。通常情况下,这会在运行循环迭代结束时发生,但您也可以创建新的自动释放池。 - JeremyP
@Stephen,如果你使用init或retain方法初始化一个对象,那么你并拥有该对象;只有在使用new、alloc、retain或copy方法时才拥有该对象。 - Dave DeLong
事实上,我本来打算保持简单明了,尽管可能会有一些准确度的损失。显然这样做失败了,所以我已经修正了我的回答。 - Stephen Darlington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接