iOS中,对象释放机制以及__weak、__unsafe_unretained的一些问题
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呢?
这里看到确实
然而,,,笑容渐渐凝固,为什么?
为什么在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
上一篇: PHP5 连接mysql数据类
下一篇: 动态仙人掌(dinosaur )