3

可能重复:
free、dealloc、release 和 autorelease 之间有什么区别?

我想摆脱在我的应用程序中使用的分配内存。我知道我需要使用,但是和release有什么区别?他们是一样的吗?free()release

4

2 回答 2

4

free()是 C 标准库的一部分,所以它是一个函数。它立即释放使用 获得的分配内存malloc(),因此必须传递一个由 分配的指针malloc(),否则它会调用未定义的行为。

- release是类的方法(相对于函数)NSObject。它不会立即释放内存;它只会将对象的引用计数减一。然后它还检查它是否为 0 - 如果它为零,它会调用- dealloc(通常由子类覆盖以释放由构造方法分配的内存,- initfree()由 分配的内存malloc())。

所以它们根本不一样,甚至不要试图互换使用它们!

于 2012-10-09T12:53:18.703 回答
-1

更有趣的部分是 free 是如何工作的:(在这个方向上, malloc 也可以更好地理解)

在许多 malloc/free 实现中,free 通常不会将内存返回给操作系统(或至少在极少数情况下)。原因是,您的堆中会出现间隙,因此它可能会发生,您刚刚完成 2 或 4 GB 的虚拟内存有间隙。这当然应该避免,因为一旦虚拟内存完成,你就会遇到很大的麻烦。另一个原因当然是,操作系统只能处理具有特定大小和对齐方式的内存块。具体来说:通常操作系统只能处理虚拟内存管理器可以处理的块(通常是 512 字节的倍数,例如 4KB)。

所以将 40 字节返回给操作系统是行不通的。那么免费有什么用呢?

Free 会将内存块放入自己的空闲块列表中。通常它还会尝试将地址空间中的相邻块融合在一起。空闲块列表只是内存块的循环列表,其中当然有一些管理数据。这也是为什么使用标准 malloc/free 管理非常小的内存元素效率不高的原因。每个内存块都需要额外的数据,并且尺寸越小,碎片就越多。

free-list 也是第一个位置,malloc 在需要时寻找新的内存块。它在从操作系统调用新内存之前被扫描。当发现一个大于所需内存的块时,它只是分为两部分。一个返回给调用者,另一个被放回空闲列表。

发布:Cocoa 使用某些命名约定。任何以 alloc、new 或 copy 开头的东西都会返回一个 retainCount 为 1 的东西,你需要释放。当 release 被调用时, reatinCount 减 1

于 2012-10-09T13:03:02.200 回答