您的位置:首页 > 移动开发 > IOS开发

浅谈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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存管理 ios OC