所有内容引用自
《Objective-C 高级编程 iOS与OS X多线程和内存管理》
,加入了自己的部分理解。
本节小结,点小1
跳到底部[1]
第二节、alloc/retain/release/dealloc实现
第三节、autorelease实现
1、 ARC
Automatic Reference Counting
,自动引用计数。在LLVM
编译器中设置ARC
为有效状态,就不再手动添加 retain
或release
,编译器会在合适的位置自动加入。
ARC
需要满足三个条件:
-
Xcode4.2
及以上版本 -
LLVM 3.0
及以上版本 - 选项中设置
ARC
有效
2、内存管理的思考方式
不要只注意在计数上,理解思考方式即可:
- 自己生成的对象,自己持有
- 非自己生成的对象,自己也能持有
- 自己持有的对象,不再需要时释放
- 非自己持有的对象,不能释放
对象操作和OC方法对应:
对象操作 | OC方法 |
---|---|
生成并持有对象 |
alloc/new/copy/mutableCopy 等 |
持有对象 | retain |
释放对象 | release |
废弃对象 | dealloc |
注:
其中Cocoa
框架中Foundation
框架类库的NSObject
类担负内存管理的职责。
alloc/retain/release/dealloc
都来自NSObject
自己生成的对象,自己持有
凡是以下名称开头的方法,都是自己生成自己持有:
alloc
new
copy
mutableCopy
copy、mutableCopy
,生成并持有对象的副本,一个是不可变对象,一个是可变对象。
举个🌰
以下都是自己生成并持有对象:
allocObj
newObj
copyObj
mutableCopyObj
以下是错误的🌰:
allocate
newer
copying
mutableCopyed
注:
以驼峰命名的开头才算是有效的
非自己生成的对象,自己也能持有
🌰
// 生成对象,但不持有,后面会讲原因
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
会把对象注册到自动释放池中,自动释放池结束生命周期时,释放所有对象。
-
😊假装是锚点的脚注 ↩
网友评论