欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 12:33:49
...

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呢?

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

这里看到确实

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

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

为什么在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