浅谈iOS内存管理
2015-12-26 22:08
260 查看
说到内存管理,首先要知道内存管理的几种方式 :
垃圾回收(gc): Java中用的内存管理方式
MRC(Manual Reference Count) :
ARC(Auto Reference Count)
iOS⽀支持两种内存管理⽅方式:ARC和MRC。MRC的内存管理机制是:引⽤用计数。ARC是基于MRC的。
MRC 手动引用计数,空间的开辟和释放都需要我们自己来写代码控制,相比GC更灵活,但是对我们要求比较高,只有深入理解内存管理机制才可以用好MRC,
ARC 自动引用计数,编译器特性,我们只需要写开辟空间的代码,回收空间的代码由编译器自动帮我们生成,ARC不是GC,本质上还是MRC.
iOS中引起内存问题的原因
1.内存溢出---所需要的内存已经超过了系统可分配内存的上限.
2.野指针异常---内存空间已经被回收,但是指针依然在操作这块被回收的空间.
3.内存泄露---内存开辟后因为某种原因无法被回收掉.(原因可能为指针重指向).
4.过度释放---当引用计数降到0的时候,对象占用的内存空间已经被回收,如果再对其进行任何方法的调用,原则上都会引起crash.有一些特殊的情况不会马上crash例如:1.对象内存释放时,所用内存并没有完全被擦除,仍有旧对象部分数据可用
2
原内存位置被写入同类或同样结构的数据
OC采用引用计数机制管理内存,当一个新的引用指向对象时,计数器就递增,当去掉一个引用时,引用计数就递减,当引用计数到零时,该对象就将释放占有的资源.(引用计数只有在堆区才有意义,其它区的引用计数是无限大(-1))
如果要学习引用计数,不要用字符串类.(NSString是一个类簇,内部会根据传入的值选择符合的子类创建对象,所以我们无法判断NSString内部是以什么样的方式创建的子类,也就无法根据引用计数判断)
内存管理黄金法则;
凡是使用了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少.在一段代码内,增加和减少的次数要相等.
永远不要手动的调用dealloc方法(系统会在引用计数为0的时候自动调用dealloc方法)
4000
垃圾回收(gc): Java中用的内存管理方式
MRC(Manual Reference Count) :
ARC(Auto Reference Count)
iOS⽀支持两种内存管理⽅方式:ARC和MRC。MRC的内存管理机制是:引⽤用计数。ARC是基于MRC的。
MRC 手动引用计数,空间的开辟和释放都需要我们自己来写代码控制,相比GC更灵活,但是对我们要求比较高,只有深入理解内存管理机制才可以用好MRC,
ARC 自动引用计数,编译器特性,我们只需要写开辟空间的代码,回收空间的代码由编译器自动帮我们生成,ARC不是GC,本质上还是MRC.
iOS中引起内存问题的原因
1.内存溢出---所需要的内存已经超过了系统可分配内存的上限.
2.野指针异常---内存空间已经被回收,但是指针依然在操作这块被回收的空间.
3.内存泄露---内存开辟后因为某种原因无法被回收掉.(原因可能为指针重指向).
4.过度释放---当引用计数降到0的时候,对象占用的内存空间已经被回收,如果再对其进行任何方法的调用,原则上都会引起crash.有一些特殊的情况不会马上crash例如:1.对象内存释放时,所用内存并没有完全被擦除,仍有旧对象部分数据可用
2
原内存位置被写入同类或同样结构的数据
OC采用引用计数机制管理内存,当一个新的引用指向对象时,计数器就递增,当去掉一个引用时,引用计数就递减,当引用计数到零时,该对象就将释放占有的资源.(引用计数只有在堆区才有意义,其它区的引用计数是无限大(-1))
如果要学习引用计数,不要用字符串类.(NSString是一个类簇,内部会根据传入的值选择符合的子类创建对象,所以我们无法判断NSString内部是以什么样的方式创建的子类,也就无法根据引用计数判断)
内存管理黄金法则;
凡是使用了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少.在一段代码内,增加和减少的次数要相等.
永远不要手动的调用dealloc方法(系统会在引用计数为0的时候自动调用dealloc方法)
4000
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Lua的内存管理浅析
- 跟我学习JScript的Bug与内存管理
- 跟我学习javascript的垃圾回收机制与内存管理
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- 深入探讨PHP中的内存管理问题
- .net平台推送ios消息的实现方法
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- javascript内存管理详细解析