C++/Objective-C内存管理对比学习
2016-02-27 22:38
316 查看
C++内存管理
内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈。存储函数中局部变量,函数结束时会自动释放。
堆。由new分配的内存块,由应用程序控制它的回收(需要手动回收),即一个new应该对应一个delete。如果程序员没释放,则程序结束系统会自动回收。
自由存储区。使用malloc分配的内存块,和堆类似,用free来释放。
全局/静态存储区。存放全局变量和静态变量。
常量存储区。存放常量,里面的值不允许修改。
堆与栈的不同。
栈是由编译器自动管理的,堆则需要手动管理,否则容易导致内存泄露。栈空间一般比较小,而堆内存空间可以很大。
对于堆,因为频繁的使用new/delete会造成内存空间不连续,导致碎片化问题产生,使程序效率降低。而栈是先进先出的结构,以至于它不会导致碎片化的产生。
堆都是动态分配的。栈有两种分配方式,一种动态分配一种静态分配。静态分配由编译器完成,比如局部变量的分配。动态分配由alloca函数进行分配,其由编译器进行释放。
PS:一个防止堆破碎的通用方法则是从不同固定大小的内存池中分配不同类型的对象。需要对每个类重载new和delete提供这样的控制。
malloc/free和new/delete的区别
malloc与free是C/C++语言的标准库函数,new与delete是C++的运算符。它们都可用于申请动态内存和释放内存。malloc与free无法满足动态对象的需求。
参考文章:
http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.htmlhttp://blog.csdn.net/bizhu12/article/details/6668834
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的运行环境会回收这个对象。你拥有你创建的对象。也就是说创建的对象(使用alloc,new,copy或者mutabelCopy等方法)的初始引用计数是1。
给对象发送retain消息后,你拥有了这个对象。
当你不需要使用该对象时,发送release或者autorelease消息放弃这个对象
不要对你不拥有的对象发送“放弃”的消息。
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参考资料
OC内存管理iOS开发系列—Objective-C之内存管理
iOS笔记:内存管理
PS:附带一篇JAVA垃圾收集的参考资料。
1. Java垃圾回收机制
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 关于指针的一些事情
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- c++ primer 第五版 笔记前言
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua的内存管理浅析
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析