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
- oc ARC中NSString* weak与Strong指针问题
- ARC 中 Strong,Weak
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- ARC指南1 - strong和weak指针
- BOOST安装或编译
- mapGetters工具函数
- java 中 手机号和身份证号的隐藏替换
- c++中的固定格式用法
- 三分钟HTML5画布(Canvas)动画教程
- oc ARC中NSString* weak与Strong指针问题
- Spring Web mvc Maven实现文件上传
- MySQL临时表
- TensorFlow实现KNN
- auicss下APP底部导航
- 走进servlet
- Linux内核学习的一些国外网站
- windows XP安装服务
- Hudson持续集成使用笔记