1.ARC MRC GC
(1)ARC 自动技术管理 ARC的规则就是只要对象没有强指针引用,就会被释放掉,换而言之 只要还有一个强引用指针变量指向对象,那么这个对象就会存在内存中。弱指针指向的对象,会被自动变成空指针(nil指针),从而不会引发野指针错误。引用计数方式的内存管理方式没有变,只是自动地帮我们去处理引用计数strong变量在超出变量作用域时,会自动释放其所retain的对象,即自动调用release(编译器自动插入release,用clang看程序汇编输出可以看出来,插入objc_release)
ARC缺点:
1.循环参照:A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
解决办法:一段用强引用,一段用弱引用。outlet的控件属性都是weak修饰,因为他们已经被父控件强引用。http://www.cnblogs.com/wengzilin/p/4347974.html写的不错
死循环:如果有个ViewController中有无限循环,也会导致即使ViewController对应的view消失了,ViewController也不能释放。
(2)MRC 手动计数管理 持有对象,retain+1 ,引用计数加1, 释放对象:release -1, 引用计数减1,当引用计数为0时,会自动释放内存. autorelease对象内存的管理放到autoreleasepool中, 当pool drain时,回收内存. (这是基于 objective-c的运行时特性和垃圾回收机制)
2.ARC会造成额外的retain/release,造成不必要的消耗,正是因为这样它会比MRC慢一点 不过这些额外的引用计数暴增了代码运行的正确性
MRC缺点:
1.释放一个堆内存时,要保证这个堆空间的指针都被release,避免提前释放。
2、释放指针指向的堆空间,首先要确定哪些指向同一个堆,这些指针只能释放一次。(避免释放多次,造成内存泄露)
3、模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁释放多线程操作时,不确定哪个线程最后使用完毕。
(3)GC iOS开发只支持手动内存管理与ARC,Mac开发支持GC垃圾回收机制,10.8之后弃用了GC,推荐使用ARC,GC的全称是Garbage collection,内存垃圾回收机制,ARC比GC性能好。