引用计数
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方法生成并持有的对象一样,成为了自己持有的。