MRC原理
MRC: 手动管理内存(retain, release, autorelease,不多说) 持有对象,retain+1 ,引用计数加1, 释放对象:release -1, 引用计数减1,当引用计数为0时,会自动释放内存. autorelease对象内存的管理放到autoreleasepool中, 当pool drain时,回收内存. (这是基于 objective-c的运行时特性和垃圾回收机制)
MRC下内存管理的缺点:
1、释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2、释放指针指向的堆空间,首先要确定哪些指向同一个堆,这些指针只能释放一次。(避免释放多次,造成内存泄露)
3、模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁释放
多线程操作时,不确定哪个线程最后使用完毕。
ARC原理
ARC的规则就是只要对象没有强指针引用,就会被释放掉,换而言之 只要还有一个强引用指针变量指向对象,那么这个对象就会存在内存中。弱指针指向的对象,会被自动变成空指针(nil指针),从而不会引发野指针错误。
ARC有什么好处
引用计数方式的内存管理方式没有变,只是自动地帮我们去处理引用计数strong变量在超出变量作用域时,会自动释放其所retain的对象,即自动调用release(编译器自动插入release,用clang看程序汇编输出可以看出来,插入objc_release)
ARC缺点:
1.虽然ARC给我们编程带来的很多好多,但也可能出现内存泄露。如下面两种情况:
循环参照:A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
解决办法:一段用强引用,一段用弱引用。outlet的控件属性都是weak修饰,因为他们已经被父控件强引用。
死循环:如果有个ViewController中有无限循环,也会导致即使ViewController对应的view消失了,ViewController也不能释放。
2.ARC会造成额外的retain/release,造成不必要的消耗,正是因为这样它会比MRC慢一点 不过这些额外的引用计数暴增了代码运行的正确性
ARC只对OC对象的进行内存管理,对于CoreFundation的api使用,他的对象所有权没有移交给OC对象管理,都需要手动去释放。现在Xcode支持ARC/MRC混合编码
<big>一个iOS学习路上的小学僧,欢迎指正!