自动引用计数(Automatic Reference Counting)是Objective-C默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain或release),来管理对象的创建与释放。
哪些对象受ARC管理
- OC对象指针
- Block指针
- 使用attribute((NSObject))定义的typedef
哪些对象不受ARC管理
- 值类型
- 使用其他方式分配的堆对象,如malloc
- 非内存资源
ARC的操作规范或过程
- 新创建(new alloc copy)一个引用类型对象,引用计数为1
NSObject obj = [NSObject alloc]; - 如下操作会使引用计数加1(即retain操作):
//1.将对引用赋值给其它变量、常量、属性、实例常量
NSObject obj2 = obj;
//2.将对象加入集合中
NSSet set;
[set addObject:obj];
//3.将对象传递给函数参数,或者返回值
void draw(BLNPoint *p){
NSLog(@"[%ld, %ld]",(long)p.x, (long)p.y)
} - 对象引用计数减1——release操作:
//1.将变量赋值为nil或其它值
obj = nil;
//2.属性或实例变量所在的对象被释放、或赋为其它值
//3.参数或局部变量离开函数
//4.将对象从集合中删除
[array removeObjectAtIndex:0]; - 引用计数变为0时,内存自动被释放。
自动释放池
当引用计数变为0时,对象会触发release事件,使内存立即释放。但是如果频繁对对象进行release,可能会造成琐碎的内存管理负担。autorelease可以将release的调用延迟到自动释放池被释放时。
void poolDemo(){
@autoreleasepool {
for (int i = 0; i < 10; i++) {
__unused BLNRectangle *rect = [[BLNRectangle alloc]init];
}
}
}
什么时候需要手工管理自动释放池
- 编写的程序不基于UI框架,如命令行程序。
- 再循环中创建大量临时对象,需要更早的释放,避免临时对象聚集导致内存峰值过大
- 在主线程之外创建新的线程,在新线程开始执行处,需要创建自己的Autorelease Pool。
- 可以嵌套使用Autorelease Pool
网友评论