ARC
- OC使用引用计数机制来管理内存,每次runloop完成一个循环的时候,都会检查对象的retainCount,如果retainCount为0,就释放
- 内存管理的原则:
- 只要还有人用这个对象,那么这个对象就不会被回收
- 如果想使用这个对象,就让他的引用计数+1
- 当不再使用某个对象的时候,就让它的引用计数-1
- 谁创建谁release 谁retain 谁release
- 总起来说就是有加就有减
- alloc allocWithZone时,该对象引用计数加1
- copy:如果时mutableCopy,则为深拷贝,会产生新的对象,并且新的对象的引用计数为1,如果时copy,则为浅拷贝,只是拷贝了原对象的地址,原对象引用计数+1
- autorelease:把该对象加入自动释放池,当自动释放池释放时,其内所有的对象引用计数-1
- 自动释放池何时被销毁?简单的看,是autoreleasse的}执行完之后。而实际情况是当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop中都加入了自动释放池的Push和pop,底层是通过Observer监听Runloop的状态,一旦监听到RunLoop即将进入睡眠等待状态,就释放自动释放池
- 多次调用对象的autoreleasse方法会导致野指针异常
- 注意:iOS中没有垃圾回收机制,autorelease只是延迟时间统一释放,而垃圾回收机制是每隔一段时间询问程序,看是否有指针指向对象,如果有就将它回收
- 如何解决ARC机制下类的相互引用:
- .h文件中使用@class关键字声明一个类
- 两端不能都用强指针,一端用strong,一端用weak