ARC 中strong与weak问题,求大神解答

qq_22544649 2016-11-22 05:39:40
NSString *string1 =@"string1";
__weak NSString* string2 = string1;
string1 =nil;
NSLog(@" %@ %@ ",string1,string2);

按理说“string1”的strong指针被释放时,weak会立即自动变为nil,为什么string2输出来还是“string1”
2016-11-22 13:40:21.265 OC[1213:55518] (null) string1
...全文
525 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
linkedin_38363504 2017-04-17
  • 打赏
  • 举报
回复
个人愚见
当string1置于nil 的时候指向内存地址(0x0),但是@“ string1” 还活着,string2还是指向了@“ string1”
hehai_1 2017-04-17
  • 打赏
  • 举报
回复
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); NSString * str1 = @"hello world"; __weak NSString * str2 = str1; str1 = nil; NSLog(@"str1:%@,str2:%@",str1,str2); } return 0; } 我测试了一下,不会报错,我想了一下,觉得是这样的, str1 = nil 之后,str1 指针指向了 nil所在的内存地址(0x0) ,此时hello,world的生命周期还没结束,所以它还没有被释放,str2 依然指向了 hello world 所在的内存地址,但是str2 是一个弱引用,当他的生命周期结束之后,str2 也要指向nil ,同时,hello,world才会被释 放掉,简单的讲,就是 调用 NSLog(@"str1:%@,str2:%@",str1,str2); 这句代码的时候,hello ,world 还没有被释放,str2 依然弱引用它.
thehunters 2016-11-29
  • 打赏
  • 举报
回复
查了一下weak引用会立即释放了。应该是野指针,输出也不可测
thehunters 2016-11-28
  • 打赏
  • 举报
回复
helloworld.m:7:2: error: cannot create __weak reference in file using manual reference counting __weak NSString *s2 = s1; 编译都报错了吧,这种赋值不允许的啊,估计你输出的是野指针内容
麒丞 2016-11-23
  • 打赏
  • 举报
回复
这涉及到nsstring的优化了,如果你建一个基于nsobject的对象来试的话,就是都为nil的

    Test *test = [[Test alloc]init];
    test.name = @"string1";
    
    Test *test1 = test;
    NSLog(@" %@ %@",test.name,test1.name);
    test.name = @"string2";
    NSLog(@" %@ %@",test.name,test1.name);

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧