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

__unsafe_unretained是Objective-C中的所有权修饰符,用于指示一个指针不会被ARC(自动引用计数)所管理。使用此修饰符时,开发者需手动管理内存,否则可能导致程序崩溃。本文通过实例演示了__unsafe_unretained与__weak修饰符的区别,并说明了不当使用可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值