顾名思义,ARC(Automatic Reference Counting)是指内存管理中对饮用采取自动计数的技术。“在LLVM编译器中设置ARC为有效状态,就无需再次渐入retain或者是release代码”
使用ARC必须满足的条件:
思考:
//自己生成并持有对象 id obj = [[NSObject alloc] init];
//非自己生成并持有对象 id obj = [NSMutableArray array]; [obj retain];
//自己生成并持有对象 id obj = [[NSObject alloc] init]; [obj release];
id obj = [[NSObject alloc] init]; [obj release]; [obj release];//运行出错
苹果大概是采用散列表(引用计数表)来管理引用计数。
所有权修饰符
该修饰符修饰的变量在超出其作用域时被废弃,随着强引用的实效,引用的对象将被废弃
{ id __strong obj = [[NSObject alloc]init]; } //函数外obj超出作用域,强引用实效,自动释放自己持有的对象,对象所有者不存在,因此被废弃
循环引用容易造成内存泄漏,所谓内存泄漏就是应当被废弃的对象在超出其生存周期后继续存在
该修饰符修饰的变量不属于编译器的内存管理对象
在访问__weak修饰符的变量时,实际上必定要访问到注册到autoreleasingpool的对象
id __weak obj1 = obj0; NSLog(@"class = %@",[obj1 class]);
//以下代码与上述一致
id __weak obj1 = obj0; id __autoreleasing tmp = obj1; NSLog(@"class = %@",[tmp class]);
这是因为__weak修饰符只持有对象的弱引用,而在访问引用对象时,该对象可能被废弃,如果把要访问的对象注册到autoreleasingpool中,那么在@autoreleasingpool块结束之前都能确保对象存在,因此在访问__weak修饰符的变量时,实际上必定要访问到注册到autoreleasingpool的对象
属性声明的属性 | 所有权修饰符 |
---|---|
assign | __unsafe _ unretained |
copy | __strong |
retain | __strong |
strong | __strong |
unsafe_retained | __unsafe _ unretained |
weak | __weak |
规则
显式转换“id”和“void”(__bridge/toll-free bridge)