__unsafe_unretained修饰符
__unsafe_unretained是不安全的所有权修饰符。尽管ARC式的内存管理是编译器的工作,但附有__unsafe_unretained修饰符的变量是不属于编译器的内存管理对象。
id __unsafe_unretained obj = [[NSObject alloc]init];
代码中将自己生成并持有的对象赋值给附有__unsafe_unretained修饰符的变量中。虽然使用了unsafe的变量,但是编译器并不会忽略,而是给出适当的警告。
附有__unsafe_unretained修饰符的变量通附有__weak修饰符的变量是一样的,因为自己生成并持有的对象不能继续为自己所有,所以生成的对象会立即被释放。(到这里__unsafe_unretained和__weak修饰符是一样的)。
id __unsafe_unretained obj1 = nil;
{
id __strong obj0 = [[NSObject alloc]init]; //生成并持有对象。
obj1 = obj0;//虽然obj0变量赋值给obj,但是obj1变量既不持有对象的强引用也不持有弱引用
nslong(@"A: %@",obj1);//输出obj1变量表示的对象
}
/*
因为obj0变量超出其作用域,强引用失效;
所以自动释放自己持有的对象;
因为对象没有持有者,所以废弃该对象。
*/
nslong(@"B: %@",obj1);
/*
输出obj1变量表示的对象
obj1变量表示的对象已经被废弃了(悬垂指针)
错误访问!
*/
执行结果为:
A:<NSObject: ox752312>
B:<NSObject: ox752312>
也就是说,最后一个输出只是碰巧正常运行而已。虽然访问了已经被废弃的对象,但是应用程序在个别运行的状况下才会崩溃。