oc ARC中NSString* weak与Strong指针问题

来源:互联网 发布:什么是php 编辑:程序博客网 时间:2024/06/11 11:24

        ARC评估了对象的生命周期,并自动插入合适的代码在编译时期,从而代替开发者不得不考虑何时需要retain、release和autolease。

对象的属性默认是strong,即强引用。即只要有strong指针引用,对象就不会被销毁。而weak(弱引用)不是对象的拥有者,只是简单的引用,

当指向的对象被释放,弱引用会自动设置为nil。然而在NSString*对象中存在一个小问题;

下面举个例子:

       NSString* string1=@"string1";//默认为strong        __weak NSString* string2=string1;//弱引用        string1=nil;//释放强引用        NSLog(@"string1=%@",string1);        NSLog(@"string2=%@",string2);
结果为:

2016-11-23 16:15:36.603 OC[1658:81632] string1=(null)2016-11-23 16:15:36.608 OC[1658:81632] string2=string1

看到这个结果是不是大吃一惊,弱引用string2不是为nil吗?为什么会是“string1”。是不是ARC 内存管理有问题呢?

其实不然,@""这种方式构造的字符串是常量,编译后放到程序的常量区。放在常量区的数据是跟程序生命周期

绑定的,所以引用计数不会生效。现在的编译器都会有一定的优化,看下面例子。

        NSString *a = @"str";        NSString *b = @"str";        NSLog(@"%p",a);        NSLog(@"%p",b);    2016-11-23 16:33:51.168 OC[1734:86306] 0x100001038   2016-11-23 16:33:51.174 OC[1734:86306] 0x100001038

第一行构造一个常量放到程序常量区

第二行在编译时编译器发现常量区有一个一模一样的字符串,编译器不再生成一个重复的字符串而是返回该字符串的地址。






0 0
原创粉丝点击