不问不闻网

【iOS】—— 引用计数

【iOS】—— 引用计数

引用计数

MRC和ARC

引用计数——MRC和ARC两种设计模式

  • MRC:Manul Reference Counting(手动引用计数)
    需要手动管理内存,引用计即手动添加release/retain等内存管理代码,引用计否则,引用计会造成内存泄露
  • ARC:Automatical Reference Counting(自动引用计数)
    iOS中的引用计垃圾回收机制跟其它语言不同,iOS的引用计内存管理机制是Xcode帮我们添加内存管理的代码,不用像MRC那样,引用计手动添加retain/release代码

自动引用计数

在Objective-C中采用Automatic Reference Counting (ARC)机制,引用计让编译器来进行内存管理。引用计在新一代Apple LLVM编译器中设置ARC为有效状态,引用计就无需再次键入retain或者release代码,引用计这在降低程序崩溃、引用计内存泄漏等风险的引用计同时,很大程度上减少了开发程序的引用计工作量。编译器完全清楚目标对象,引用计并能立刻释放那些不再被使用的引用计对象。如此来,应用程序将具有可预测性,且能流畅运行,速度也将大幅提升。

引用计数过程

请添加图片描述

OC 语言使用引用计数来管理内存每个对象都有个可以递增或递减的计数器,如果想某个对象继续存活,那就递增其引用计数,用完之后,就递减其计数,计数变为0,就销毁。

引用计数思考方式

  • 自己生成的对象,自己所持有
  • 非自己生成的对象,自己也能持有
  • 不再需要自己持有的对象时释放
  • 非自己持有的对象无法释放

整个过程中围绕着生成,持有,释放三个词,可以看下图:
在这里插入图片描述

release和autorelease的区别

见下图:
在这里插入图片描述

自己生成的对象,自己持有

id obj1 = [[NSObject alloc] init];id obj2 = [NSObject new];

使用NSObject类的alloc类方法就能自己生成并持有对象。指向生成并持有对象的指针被赋给变量obj。另外[NSObject new]和[[NSObject alloc]init]是完全一致的。

非自己生成的对象,自己也能持有

//取得非自己生成并持有的对象id obj = [NSMutableArray array];//取得的对象存在,但自己不持有对象[obj retain];//自己持有对象

源代码中,NSMutableArray类对象被赋给变量obj,但变量obj自己并不持有该对象。使用retain方法可以持有对象。
通过retain方法,非自己生成的对象跟用alloc/new/copy/mutableCopy方法生成并持有的对象一样,成为了自己持有的。

未经允许不得转载:不问不闻网 » 【iOS】—— 引用计数