Objective c free()和release之间的区别

Objective c free()和release之间的区别,objective-c,cocoa-touch,memory-management,free,Objective C,Cocoa Touch,Memory Management,Free,可能重复: 我想清除应用程序中使用的已分配内存。我知道我需要使用release,但是free()和release之间有什么区别呢?它们是一样的吗?free()是C标准库的一部分,所以它是一个函数。它会立即释放使用malloc()获得的分配内存,因此必须向它传递一个由malloc()分配的指针,否则它会调用未定义的行为 -release是NSObject类的方法(与函数相反)。它不会立即释放内存;它仅将对象的引用计数减少一。然后,它还检查它是否为0—如果为零,它将调用-dealloc(这通常由一

可能重复:

我想清除应用程序中使用的已分配内存。我知道我需要使用
release
,但是
free()
release
之间有什么区别呢?它们是一样的吗?

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

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


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

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

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

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

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

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


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

我以为
NSObject
是通过其
+alloc
方法分配的…@MikeDeSimone对象本身是由
+alloc
分配的,然后在
init
中,可以创建其他对象,或者在子类中分配内存;我应该像[release videoData]那样发布它还是免费发布(videoData)?@arunjalota在阅读了答案后,应该是显而易见的。如果不是,请阅读一篇Comprehensive Objective-C教程。很抱歉,这并不能回答问题。甚至不要为发布而烦恼;使用ARC和
保持/释放
消失。只有在代码中手动调用了
malloc
时,才应使用
free
。我认为如果你感到困惑,你需要仔细阅读目标C。使用ARC。使用圆弧。使用圆弧。也就是说,allarc是不够的,它只会在需要释放对象时释放对象,而不是立即释放对象,从而创建内存集群。