首页 新闻 会员 周边

iOS __strong、__weak、__unsafe_unretained的问题

0
[待解决问题]
    __strong NSString *yourString = [[NSString alloc] initWithUTF8String:"string 1"]; 

    __weakNSString *myString = yourString; 

    

    __unsafe_unretained NSString *theirString = myString;

    yourString = nil; 

    

    NSLog(@"yourString:%p --- :%@",yourString,yourString);

    NSLog(@"myString:%p --- :%@",myString,myString);

    NSLog(@"theirString:%p --- :%@",theirString,theirString);

为什么这里输出结果是

 yourString:0x0 --- :(null)
 myString:0x6861220 --- :string 1
 theirString:0x6861220 --- :string 1

按照arc的描述应该出现crash的,为什么没有?

hopeanCom的主页 hopeanCom | 初学一级 | 园豆:199
提问于:2012-10-31 09:24
< >
分享
所有回答(4)
0

这里只会出现内存泄漏,不会crash。

因为系统默认为内存是yourString创建的,系统会在某个时候去调用[yourString release]释放yourString。后来yourString被置为了nil.调用[nil release]是不会crash的。但是这里yourString开始alloc的这段内存已经不会给释放了,所以内存泄漏。

至于其他两个指针,不会对内存有影响。

sunshy_ios | 园豆:202 (菜鸟二级) | 2013-02-04 11:22
0

你输出结果能打印出这些?这么牛逼?应该会被crash的,你这原因可能时xcode问题,并没有开启实时监测僵尸对象,另外,我觉得会在最后一行崩溃,野指针错误,因为,当对象释放时,使用__weak修饰的指针变量会指向nil,而__unsafe_unretained 不会指nil,所以,出现野指针错误

撩课-Sz | 园豆:330 (菜鸟二级) | 2014-05-19 21:48
0

按照arc的描述应该出现crash的,为什么没有?

因为你用了NSString,你换成其他的对象,比如ViewController试试。

Maxfong | 园豆:202 (菜鸟二级) | 2015-11-12 09:53
0

我按照你写的奔溃了

分析一下原因:没有强指针指向的对象会自动释放

__strong NSString *yourString = [[NSString alloc] initWithUTF8String:"string 1"];//创建一个字符串

__weakNSString *myString = yourString;//一个弱指针指向youstring,这时[[NSString alloc] initWithUTF8String:"string 1"]有两个指针指向,一个强指针,一个弱指针

__unsafe_unretained NSString *theirString = myString;//

yourString = nil;//youString置为nil,[[NSString alloc] initWithUTF8String:"string 1"];没有强指针指向这时就释放了

那么__weakNSString *myString = yourString;myString指针指向的地址也不存在,释放掉了

同理theirString也释放了,在调用一个释放掉的指针就会出现内存泄露

 

 
新年新气象 | 园豆:210 (菜鸟二级) | 2015-11-17 18:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册