C++/Objective-C内存管理对比学习

19 篇文章 0 订阅

C++内存管理

内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。

  • 栈。存储函数中局部变量,函数结束时会自动释放。
  • 堆。由new分配的内存块,由应用程序控制它的回收(需要手动回收),即一个new应该对应一个delete。如果程序员没释放,则程序结束系统会自动回收。
  • 自由存储区。使用malloc分配的内存块,和堆类似,用free来释放。
  • 全局/静态存储区。存放全局变量和静态变量。
  • 常量存储区。存放常量,里面的值不允许修改。

堆与栈的不同。

  1. 栈是由编译器自动管理的,堆则需要手动管理,否则容易导致内存泄露。
  2. 栈空间一般比较小,而堆内存空间可以很大。
  3. 对于堆,因为频繁的使用new/delete会造成内存空间不连续,导致碎片化问题产生,使程序效率降低。而栈是先进先出的结构,以至于它不会导致碎片化的产生。
  4. 堆都是动态分配的。栈有两种分配方式,一种动态分配一种静态分配。静态分配由编译器完成,比如局部变量的分配。动态分配由alloca函数进行分配,其由编译器进行释放。

PS:一个防止堆破碎的通用方法则是从不同固定大小的内存池中分配不同类型的对象。需要对每个类重载new和delete提供这样的控制。

malloc/free和new/delete的区别

malloc与free是C/C++语言的标准库函数,new与delete是C++的运算符。它们都可用于申请动态内存和释放内存。
malloc与free无法满足动态对象的需求。

参考文章:

  1. http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html
  2. http://blog.csdn.net/bizhu12/article/details/6668834
  3. http://www.cnblogs.com/fangshenghui/archive/2012/06/04/2533534.html

OC内存管理

为什么需要内存管理

  对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

MRC手动内存管理

对象基本结构:

  每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
  在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。

对象的销毁:

  当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
  当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
  一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。所以在释放该对象后应该把引用置为nil。

objective-C的内存管理策略

  注:文档中把引用计数加1的操作称为“拥有”(own,或者take ownership of)某块对象/内存;把引用计数减1的操作称为放弃(relinquish)这块对象/内存。拥有对象时,你可以放心地读写或者返回对象;当对象被所有人放弃时,objective-C的运行环境会回收这个对象。

  1. 你拥有你创建的对象。也就是说创建的对象(使用alloc,new,copy或者mutabelCopy等方法)的初始引用计数是1。
  2. 给对象发送retain消息后,你拥有了这个对象。
  3. 当你不需要使用该对象时,发送release或者autorelease消息放弃这个对象
  4. 不要对你不拥有的对象发送“放弃”的消息。

ARC内存管理机制

1)判断标准

只要没有强引用指针指向对象,对象就会被释放。

2)指针类型
  • 强指针:默认情况下所有指针都是强指针,关键字strong
  • 弱指针:关键字__weak

在ARC中,只要弱指针指向的对象被释放了,则其也会被置为空。
在ARC中,property属性不使用retain而是strong,在dealloc方法中不需要再调用[super dealloc]。

注意事项

1)不允许向对象发送retain,release,retainCount消息。
2)使用weak reference(弱引用)来避免retain cycle(强引用循环)。

性能优化工具

Clang Static Analyzer,NSZombie, Instruments,Leaks

参考资料

  1. OC内存管理
  2. iOS开发系列—Objective-C之内存管理
  3. iOS笔记:内存管理

PS:附带一篇JAVA垃圾收集的参考资料。
1. Java垃圾回收机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值