一个关于NSString内存管理的问题
来源:互联网 发布:mac换硬盘重装系统 编辑:程序博客网 时间:2024/05/21 07:04
先来回顾strong和weak的使用。
Strong & Weak
在iOS 5以后,苹果引入了ARC技术和strong和weak对象变量属性。
事实上,strong关键字其实相当于之前版本的retain关键字,如果一个属性变量使用了strong关键字修饰,那么它指向的对象的引用计数就会+1(它拥有这个对象);而如果一个属性变量使用了weak关键字修饰,那么它指向的对象的引用计数则不变(它不拥有这个对象)。
在此基础上,解释ARC技术的规则就会变得很简单:只要还有一个strong指针指向对象,那么对象就不会被销毁,反之,若没有strong指针指向对象,那么对象就会被立即销毁。而weak指针指向的对象若被销毁,那么weak指针会被赋值为nil,这样做的好处是防止野指针。
NSString使用strong & weak异常
前几天在使用__strong和__weak关键字是遇到了一个问题,先看以下代码:
__strong NSString *string1 = @"string1"; __weak NSString *string2 = string1; string1 = nil; NSLog(@"string2 = %@",string2);
按之前所说的strong和weak规则,我们先用一个使用__strong关键字修饰的NSString对象string1指向了一个字符串,再用一个使用__weak关键字修饰的NSString对象string2指向了同一个字符串,之后让string1指向了nil,此时,没有一个strong指针指向了这个字符串,那么这个字符串理应被系统销毁,而string2则应该指向nil,可打印结果却是:
2015-08-03 15:32:24.045 test[6575:196538] string2 = string1
我试着输出[string class]
,代码如下:
NSString *string1 = @"string 1";NSLog(@"%@:%@", string1, [string1 class]);
打印结果则是:
2015-08-04 15:33:51.385 test[6595:197912] string 1:__NSCFConstantString
那么__NSCFConstantString是什么呢?其实__NSCFConstantString是一个字符串常量,是没有retainCount(引用计数)的,所以没有强指针指向它,它也不会被销毁。那么,怎么获得不是__NSCFConstantString的字符串呢?
NSString *string1 = @"string 1"; NSString *string2 = [NSString stringWithString:@"string 2"];NSString *string3 = [NSString stringWithFormat:@"string 3"]; NSString *string4 = [[NSString alloc] initWithString:@"string 4"]; NSString *string5 = [[NSMutableString alloc] initWithString:@"string 5"]; NSLog(@"%@:%@",string1,[string1 class]); NSLog(@"%@:%@",string2,[string2 class]); NSLog(@"%@:%@",string3,[string3 class]); NSLog(@"%@:%@",string4,[string4 class]); NSLog(@"%@:%@",string5,[string5 class]);
2015-08-03 15:35:35.587 test[6631:201537] string 1:__NSCFConstantString2015-08-03 15:35:35.587 test[6631:201537] string 2:__NSCFConstantString2015-08-03 15:35:35.587 test[6631:201537] string 3:NSTaggedPointerString2015-08-03 15:35:35.587 test[6631:201537] string 4:__NSCFConstantString2015-08-03 15:35:35.588 test[6631:201537] string 5:__NSCFString
通过以上的运行结果,发现只有使用[[NSMutableString alloc] initWithString:]得到的NSString才是__NSCFString,所以我修改代码:
__strong NSString *string1 = [[NSMutableString alloc] initWithString:@"string 1"]; __weak NSString *string2 = string1; string1 = nil; NSLog(@"string2 = %@", string2);
2015-08-03 15:37:32.635 test[6646:202674] string2 = (null)
结果符合。
转自: http://www.jianshu.com/p/fa9fe49e87b9
- 一个关于NSString内存管理的问题
- NSString的内存管理问题
- NSString 内存管理问题
- 一个关于内存管理的问题:
- NSString 类的内存管理问题
- NSString的内存管理
- NSString的内存管理
- (0019)iOS 开发之关于__weak修饰NSString以及内存管理的问题
- NSString 的内存问题
- NSString的内存问题
- iOS 初学者一个关于内存管理的问题
- NSString奇葩的内存管理
- NSString的内存分配及管理
- NSString的内存分配及管理
- Objective-C -- NSString的内存管理
- NSString的内存分配及管理
- NSString的内存分配及管理
- NSString 字符串管理内存
- Homebrew简介及安装
- 拦截器登录判断
- 数学之美番外篇:进化论中的概率论
- 二元树中和为某一值的所有路径
- 触发器学习《二》 需求示例--人员关系表、人员表
- 一个关于NSString内存管理的问题
- Java JDBC 之 URL 与数据库连接
- Activity四种启动方式
- Java 多线程:分析线程池的实现原理
- git管理项目代码
- 杭电ACM—1106 排序
- js对table的操作
- 介绍10个非常有用的PHP函数
- 八大排序算法--直接选择排序