您的位置:首页 > 移动开发 > Objective-C

Objective-C基础知识点

2015-08-22 10:28 447 查看
内存管理初级

一.内存管理介绍

1.内存的问题体现在两个方面:内存溢出和野指针异常。内存溢出是指程序所占用的内存超出内存上限,程序就会崩溃。野指针异常是指对象内存空间已经被系统回收没,仍然使用指针操作这块内存。野指针异常是程序Crash的主要原因。

2.内存的管理方式

内存的管理方式包括:垃圾回收(gc)、MRC(Manual Reference Count)和ARC(Auto Reference Count)。

第一种方式:垃圾回收

程序员只需要开辟内存空间,不需要用代码显示释放,系统来判断那些空间 不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何 代码,由系统自动完成垃圾回收。

第二种方式:Manual Reference Count(人工引用计数)

Manual Reference Count(人工引用计数),内存的开辟和释放都由程序代码进行控制。相对垃圾回收来说,对内存的控制更加灵活们可以在需要释放的时候及时释放,对程序员要求较高,程序员需要熟悉内存的管理机制。

第三种方式:Auto Reference Count(自动引用计数)

Auto Reference Count(自动引用计数)只允许用户开辟内存空间,不用去释放空间。他不是了垃圾回收!它本质上还是MRC,只是编译器帮程序员默认加了释放的代码。

iOS支持两种内存管理方式:ARC和MRC,MRC的内存管理机制是引用计数,ARC是基于MRC的。

二.内存管理机制

OC中采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数就会递增,每当去掉一个引用时,引用计数就会递减。当引用计数到零时,该对象就将释放占有的资源。

1.影响引用计数的方法:

+alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1.这是由0到1的 过程。

-retain:引用计数加1,如果内存空间之前引用计数为,retain之后变为2,如 果引用计数为5,retain之后为6.

-copy:把某一内存区域的内容拷贝一份,拷贝到新的内存空间里去,被拷 贝区域的引用计数不变,新的内存区域的引用计数为1.

-release:引用计数减1。release释放每次让引用计数减一,直到为零 (用retainCount打印出来的引用计数最后是1.),注意:release一定不要过度调用,会导致程序崩溃.

-dealloc:dealloc是继承自父类的方法(需要在类中重写该方法),当对象引用计数为0的时候,由对象 自动调用。

-autorelease:未来的某一时刻引用计数减1.

2.autoreleasepool的使用

通过autoreleasepool控制autorelease对象的释放,向一个对象发送autorelease 消息,这个对象何时释放,取决于autoreleasepool。

三.内存管理原则

引用计数的增加和减少相等,当引用计数降为0之后,不应该再使用这块内存空间。

凡是使用了alloc、retain、或者copy让内存的引用计数增加了买就需要使用release或者autorelease让内存的引用计数减少。在一段代码内,增加和减少的次数要相等。

四.copy

copy方法:

跟retain不同,一个对象想要copy,生成自己的副本,需要实现NSCopying协 议,定义copy的细节(如何copy)。如果类没有接受NSCopying协议而给对象发 送copy消息,会引起Crash。

要做copy操作,一定要遵循NSCopying协议,并且实现copyWithZone方法,copy操作新的对象的引用计数为1,copy不会影响原来的引用计数.

总结:

OC借助引⽤用计数机制去管理内存,凡是使⽤用了alloc、copy、retain等⽅方 法,增加了引用计数,就要使⽤用release和autorelease减少引⽤计数,引⽤计数为0的时候,对象所占的内存,被系统回收。

autorelease是未来某个时间(出autoreleasepool)引用减⼀,不是即时 的。

不是任何对象都可以接收copy消息,只有接受了NSCopying协议的对象 才能接收copy消息。

数组:把一个对象放到数组中时,该对象的引用计数会加1;从数组中移除时,该对象的引用计数会减1.

基本的数据类型不用释放.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: