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

有人可以解释free()releaseautoreleasedealloc之间的区别吗?

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

-dealloc是一个Objective-C选择器,当对象不再由应用程序的任何部分拥有时,由Objective-C运行时发送给对象。

-release是您发送给对象的选择器,表示您放弃该对象的所有权。 一旦对象不属于任何人,运行时就会发送-dealloc消息。

-autorelease是您发送给对象的选择器,表示您放弃对象的所有权。 但是,如果现在没有人拥有该对象,则最终的-dealloc将被推迟到某个未指定的稍后点。 事实上,你真正在做的是将你的所有权转移到自动释放池,然后在它自己被释放(或耗尽)时释放它。

除了对象自己的-dealloc方法中的super之外,你绝不-dealloc发送给对象。

在你提到的4种方法中,你通常只在objective-c中使用releaseautorelease 。 当你使用c和malloc时可以使用free ,否则你应该使用releaseautorelease

任何代码都不应调用dealloc ,因为它可能会干扰objective-c用于跟踪资源的保留/释放周期。 如果您使用dealloc几乎肯定会在运行时导致崩溃。

使用releaseautorelease的最终资源是Apple内存管理文档

  • freemalloc相反,在C中使用。你可能不会在Objective C中使用它
  • 如果您拥有一个对象,则在完成后将其release
  • 您还可以autorelease对象。 这会在当前运行循环迭代结束时自动释放它
  • 当对象上的引用计数dealloc零时,运行时调用dealloc 。 你不应该自己调用这个方法

如果您allocnewretaincopy它,您“拥有”一个对象。

Apple就此提供了一些很好的文档 。