ARC修饰符----__unsafe_unretained修饰符

来源:互联网 发布:软件测试计划的目的 编辑:程序博客网 时间:2024/06/07 03:33

__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>

也就是说,最后一个输出只是碰巧正常运行而已。虽然访问了已经被废弃的对象,但是应用程序在个别运行的状况下才会崩溃。

0 0
原创粉丝点击