【问题标题】:Difference between free() and release [duplicate]free() 和 release 之间的区别
【发布时间】:2012-09-29 19:21:13
【问题描述】:

可能重复:
What are the differences between free, dealloc, release, and autorelease?

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

【问题讨论】:

  • 别理release;使用 ARC 和 retain/release 消失。当您在代码中手动调用malloc 时,您应该只使用free。如果您感到困惑,我认为您需要阅读 Objective C。
  • 使用 ARC。使用弧。使用弧。就是这样
  • arc 是不够的,它只会在需要释放的时候释放对象,而不是立即释放它,从而创建内存集群。

标签: objective-c cocoa-touch memory-management free


【解决方案1】:

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

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

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

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

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

Release:Cocoa 使用某些命名约定。任何以 alloc、new 或 copy 开头的内容都会返回 retainCount 为 1 的内容,并且您需要释放。当调用 release 时,reatinCount 会递减 1

【讨论】:

  • 抱歉,这并不能回答问题。
【解决方案2】:

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

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

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

【讨论】:

  • 我以为NSObject 是由它的+ alloc 方法分配的...
  • @MikeDeSimone 对象本身是由+ alloc分配的,然后在init中,可能会创建额外的对象或者在子类中分配内存。
  • 所以如果我有这样的东西:NSData *videoData = [NSData dataWithContentsOfFile:exportPath];我应该像 [release videoData] 还是 free(videoData) 一样发布?
  • @arunjalota 阅读答案后,应该很明显。如果不是,请阅读全面的 Objective-C 教程。
猜你喜欢
  • 2015-11-03
  • 2011-03-21
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2010-10-18
  • 2021-01-18
相关资源
最近更新 更多