iOS中,对象释放机制以及__weak、__unsafe_unretained的一些问题

探讨iOS中弱引用(weak)与不安全未保留(__unsafe_unretained)的区别,特别是针对常驻对象如字符串、数组和字典的行为表现。通过示例代码展示不同情况下对象引用的变化。

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

iOS中,首先有一点可以确认的,就是weak修饰的,在持有或者引用为0的时候,为自动将对象nil,iOS中对于一个nil发消息是不会发生崩溃等问题的,而__unsafe_unretained则不然,他不会销毁置为nil,因此在使用不当的时候你就会看到EXC_BAD_ACCESS...

本文的意思不是探讨这个,我们来研究一下weak的问题,比如按照我们的理解,以下这段代码:

    person *p = [[person alloc]init];
    __weak person *p1 = p;
    p = nil;
    NSLog(@"%@ %@",p,p1);

分析:由于p与p1指向同一地址,且p1没有retain内存地址,而 p=nil释放了内存,所以p1为nil。

经测试确实,打印为:(null) (null)

那么以下代码呢:

    NSString *str = @"123";
    __weak NSString *str1 = str;
    str = nil;
    NSLog(@"%@ %@",str,str1);

按照我们的理解,指向同一个地址,当str=nil的时候是不是str1也是nil呢?

73f1b096e0b2d5a9713f83fb0ce98ff271a.jpg

这里看到确实

e5e8cfb204e4ac8fd4bb1d877319d786da4.jpg

然而,,,笑容渐渐凝固,为什么?

为什么在str=nil之后str1依旧有值呢?

再看下打印: (null) 123

???????这里我是一脸的???

经测试,字符串,字典,数组,都是这样,而且,直接@"123"、@[@"123"]、@{@"1":@"1"}这种类型的,实际上分别是:NSCFConstantString、NSSingleObjectArrayI、NSSingleEntryDictionaryI类型。

再说回__unsafe_unretained:

    person *p = [[person alloc]init];
    __unsafe_unretained person *p1 = p;
    p = nil;
    NSLog(@"%@ %@",p,p1);

这段代码,我们分析一下,当p为nil的时候,p1变为野指针,并未变为nil,因此就直接报出错误,但是当我们用nsstring呢?来看一下代码:

    NSString *str = @"123";
    __unsafe_unretained NSString *str1 = str;
    str = nil;
    NSLog(@"%@ %@",str,str1);

参照上边,这段代码会报错么?不会的话,结果是什么?

结果是:(null) 123

是的你没看错!经过我的验证,除了字符串,字典,数组这样操作都会报错,类似于上边的类一样,但是字符串为何就不会?这里很是费解

转载于:https://my.oschina.net/rainwz/blog/1835660

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值