iOS内存管理总结(ARC/MRC)

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学习路上的小学僧,欢迎指正!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,762评论 8 119
  • Cocoa内存管理机制 (1)当你使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1.当...
    John_LS阅读 2,820评论 0 6
  • 内存管理 ARC处理原理 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做...
    b485c88ab697阅读 11,251评论 3 47
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,014评论 1 16
  • 10月29日 所有的一切都是为了修行自己,你给别人钱是为了练习你心中的大度,跟别人无关,反...
    如水的日记阅读 232评论 1 1