如下代码:
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去做。不然你会怀疑你学到的东西是否真的正确。