iOS之OC深入理解iOS传道程序员

ios内存管理

2016-12-08  本文已影响153人  聆听者JYZ

那怎么知道对象已经没有被引用了呢?

ObjC采用引用计数(reference counting)的技术来进行管理:

1)每个对象都有一个关联的整数,称为引用计数器

2)当代码需要使用该对象时,则将对象的引用计数加1

3)当代码结束使用该对象时,则将对象的引用计数减1

4)当引用计数的值变为0时,表示对象没有被任何代码使用,此时对象将被释放。

与之对应的消息发送方法如下:

1)当对象被创建(通过alloc、new或copy等方法)时,其引用计数初始值为1

2)給对象发送retain消息,其引用计数加1

3)給对象发送release消息,其引用计数减1

4)当对象引用计数归0时,ObjC給对象发送dealloc消息销毁对象

使用自动释放池需要注意:

      1)自动释放池实质上只是在释放的时候給池中所有对象对象发送release消息,不保证对象一定会销毁,如果自动释放池向对象发送release消息后对象的引用计数仍大于1,对象就无法销毁。

2)自动释放池中的对象会集中同一时间释放,如果操作需要生成的对象较多占用内存空间大,可以使用多个释放池来进行优化。比如在一个循环中需要创建大量的临时变量,可以创建内部的池子来降低内存占用峰值。

3)autorelease不会改变对象的引用计数

自动释放极端情况:

自动释放池的释放时间是确定的,这个例子中自动释放池会在循环事件结束时释放,那问题来了:在这个十万次的循环中,每次都会生成一个字符串并打印,这些字符串对象都放在池子中并直到循环结束才会释放,因此在循环期间内存不增长。

这类问题的解决方案是在循环中创建新的自动释放池,多少个循环释放一次由我们自行决定。

iOS5以后开始使用ARC来管理内存:

1、ARC可以理解成一位管家,这个管家会帮我们向对象发送retain和release语句

2、ARC能帮我们简化内存管理问题,但不代表它是万能的,还是有它不能处理的情况,这就需要我们自己手动处理,比如循环引用、非ObjC对象、Core Foundation中的malloc()或者free()等等

3、__strong:强引用,持有所指向对象的所有权,无修饰符情况下的默认值。如需强制释放,可置nil

4、__weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置nil,避免野指针

可以用僵尸断点来探测野指针

上一篇下一篇

猜你喜欢

热点阅读