如下代码:
NSString* firstName = @"natsu";
__weak NSString * weakName = firstName;
firstName = @"maki";
NSLog(@"weakName = %@;firstName = %@",weakName,firstName);你觉得输出结果应该是什么呢?
weakName因为有__weak关键字修饰,只会弱引用firstName指向的地址。当firstName被重新赋值之后,第一次的值natsu应该会被释放掉,那么weakName就应该指向了nil。
可是结果却是:
[1034:60b] weakName = natsu;firstName = maki这是不是很奇怪呢?
下面我们把NSString换成 NSObject:
NSObject* firstName = [[NSObject alloc] init];
__weak NSObject * weakName = firstName;
firstName = [[NSObject alloc] init];
NSLog(@"weakName = %@;firstName = %@",weakName,firstName);
结果是:
[1047:60b] weakName = (null);firstName = <NSObject: 0x8e49b40>这下就对了。
总结:NSString是一个奇葩的Object-c对象,要想对内存管理的知识进行实验,千万别用NSString去做。不然你会怀疑你学到的东西是否真的正确。
本文通过对比NSString与NSObject在弱引用行为上的不同表现,揭示了NSString作为一种特殊对象,在内存管理方面的特例情况,并提醒开发者在进行内存管理实验时避免使用NSString。
1290

被折叠的 条评论
为什么被折叠?



