iOS开发 strong和weak的使用

在iOS 5以后,苹果引入了ARC技术和strong和weak对象变量属性。

事实上,strong关键字其实相当于之前版本的retain关键字,如果一个属性变量使用了strong关键字修饰,那么它指向的对象的引用计数就会+1(它拥有这个对象);而如果一个属性变量使用了weak关键字修饰,那么它指向的对象的引用计数则不变(它不拥有这个对象)。在此基础上,解释ARC技术的规则就会变得很简单:只要还有一个strong指针指向对象,那么对象就不会被销毁,反之,若没有strong指针指向对象,那么对象就会被立即销毁。而weak指针指向的对象若被销毁,那么weak指针会被赋值为nil,这样做的好处是防止野指针。

举例:

__strong NSString *string1 = @"string1";
__weak NSString *string2 = string1;
string1 = nil;
NSLog(@"string2 = %@",string2);

运行结果:

2015-04-18 09:54:24.045 内存管理[6575:196538] string2 = string1

发现string1 = nil,并没有强指针指向@"string 1"了,它被销毁,string2被赋值为nil,但结果并不是想象中的string2 = (null),这是为什么呢?我试着输出[string class],代码如下:
NSString *string1 = @"string 1";
NSLog(@"%@:%@",string1,[string1 class]);
运行结果:

2015-04-18 09:58:51.385 内存管理[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"];
NSLog(@"%@:%@",string1,[string1 class]);
NSLog(@"%@:%@",string2,[string2 class]);
NSLog(@"%@:%@",string3,[string3 class]);
NSLog(@"%@:%@",string4,[string4 class]);
NSLog(@"%@:%@",string5,[string5 class]);
运行结果:

2015-04-18 10:14:35.587 内存管理[6631:201537] string 1:__NSCFConstantString

2015-04-18 10:14:35.587 内存管理[6631:201537] string 2:__NSCFConstantString

2015-04-18 10:14:35.587 内存管理[6631:201537] string 3:NSTaggedPointerString

2015-04-18 10:14:35.587 内存管理[6631:201537] string 4:__NSCFConstantString

2015-04-18 10:14:35.588 内存管理[6631:201537] string5:__NSCFString

通过以上的运行结果,发现只有使用[[NSMutableString alloc] initWithString:]得到的NSString才是 __NSCFString,所以我修改代码:
__strong NSString *string1 = [[NSMutableString alloc] initWithString:@"string 1"];
__weak NSString *string2 = string1;
string1 = nil;
NSLog(@"string2 = %@",string2);
运行结果:

2015-04-18 10:18:32.635 内存管理[6646:202674] string2 = (null)

结果符合。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值