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。spa
经测试确实,打印为:(null) (null)指针
那么如下代码呢:code
NSString *str = @"123"; __weak NSString *str1 = str; str = nil; NSLog(@"%@ %@",str,str1);
按照咱们的理解,指向同一个地址,当str=nil的时候是否是str1也是nil呢?对象
这里看到确实blog
然而,,,笑容渐渐凝固,为何?内存
为何在str=nil以后str1依旧有值呢?字符串
再看下打印: (null) 123string
???????这里我是一脸的???
经测试,字符串,字典,数组,都是这样,并且,直接@"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
是的你没看错!通过个人验证,除了字符串,字典,数组这样操做都会报错,相似于上边的类同样,可是字符串为什么就不会?这里非常费解