内存管理/引用计数 - 思考方式

2018-09-01  本文已影响8人  关灯侠

所有内容引用自《Objective-C 高级编程 iOS与OS X多线程和内存管理》,加入了自己的部分理解。

本节小结,点小1跳到底部[1]
第二节、alloc/retain/release/dealloc实现
第三节、autorelease实现

1、 ARC

Automatic Reference Counting,自动引用计数。在LLVM编译器中设置ARC为有效状态,就不再手动添加 retainrelease,编译器会在合适的位置自动加入。

ARC需要满足三个条件:


2、内存管理的思考方式

不要只注意在计数上,理解思考方式即可:

对象操作和OC方法对应:

对象操作 OC方法
生成并持有对象 alloc/new/copy/mutableCopy
持有对象 retain
释放对象 release
废弃对象 dealloc

注:其中Cocoa框架中Foundation框架类库的NSObject类担负内存管理的职责。
alloc/retain/release/dealloc都来自NSObject

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

凡是以下名称开头的方法,都是自己生成自己持有:

copy、mutableCopy,生成并持有对象的副本,一个是不可变对象,一个是可变对象。

举个🌰
以下都是自己生成并持有对象:

以下是错误的🌰:

注:以驼峰命名的开头才算是有效的

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

🌰

// 生成对象,但不持有,后面会讲原因
id obj = [NSMutableArray  array];

// ARC 自动加上了retain,ARC模式下不要添加
[obj retain];

注:非自己生成的对象,可以通过retain方法来持有。

自己持有的对象,不再需要时释放

使用release方法释放。
自己持有的对象,有两种情况,要么自己生成自己持有的,要么通过retain持有的。

着重说下[NSMutableArray array],为什么能生成对象,但不持有。
举个🌰:

- (id)object{
    // 自己生成,自己持有
    id obj = [[NSObject alloc] init];
    // 对象存在,但自己不持有对象
    [obj autorelease];
     
    return obj; 
}

autorelease使对象在超出指定的生存范围后,可以自动释放,即调用release方法。

简单原理:autorelease先将对象注册到autoreleasepool中,autoreleasepool超出作用域后,会把所有注册在其中的对象都release释放。

注:凡是取得谁都不持有的对象,都是用autorelease实现的。如前面的[NSMutableArray array]

非自己持有的对象,不能释放

注:非自己持有的对象,不能释放,会引起崩溃。


小结

1、内存管理的思考方式:

2、以alloc/new/copy/mutableCopy名称开头方法会持有对象,必须以驼峰命名。
3、生成对象,但不持有,都是autorelease实现的。
4、autorelease会把对象注册到自动释放池中,自动释放池结束生命周期时,释放所有对象。


  1. 😊假装是锚点的脚注

上一篇 下一篇

猜你喜欢

热点阅读