所有权修饰符
- ARC有效时,id类型和对象类型同C语言其他类型不同,其类型上必须附加所有权修饰符。所有权修饰符一共有4种。
- __strong 修饰符
- __weak 修饰符
- __unsafe_unretained 修饰符
- __autoreleasing 修饰符
__strong 修饰符
__strong 修饰符是默认的所有权修饰符。(id obj = [[NSOject alloc] init] 等价于id __strong obj = [[NSOject alloc] init] )
附有__strong修饰符的变量在超出其变量作用域时,即在该变量被废弃时,会释放其被赋予的对象。
持有强引用的变量在超出其作用域时被废弃,随着强引用的失效,引用的对象会随之释放。
__strong 修饰的变量为强引用,强引用变量自己持有对象,即取得非自己生成并持有的对象,对持有的对象遵循谁持有谁释放原则,同时一个对象可能被多个变量持有。
通过__strong修饰符,不必再次键入retain或者release,完美地满足了“引用计数式内存管理的思考方式”。
__weak 修饰符
__weak 修饰符解决引用计数式内存管理中必然会发生的“循环引用”的问题。另外一个优点是,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态。发生循环引用的例子如:对自身的强引用;对象之间的相互强引用。
__weak修饰符提供弱引用。弱引用不能持有对象实例。
__autoreleasing 修饰符
ARC有效时不能使用autorelease,但是autorelease功能是起作用的。使用“@autoreleasepool{}”来代替“NSAutoreleasePool类对象生成、持有及废弃”这一范围。并且,ARC有效时,通过将对象赋值给附加了__autoreleasing修饰符的变量来替代调用autorelease方法。
id的指针胡对象的指针在没有显示指定时会被附加上__autoreleasing修饰符。