Objective-C基础知识点

内存管理初级
一.内存管理介绍
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.

基本的数据类型不用释放.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值