NSString *str = @"aaa";
[self change:str];
NSLog(@"%@",str);
- (void)change:(NSString *)str {
str = @"bbb";
}
这道经典的面试题,打印结果是aaa,不是我们想象中的bbb。
那为什么会这样呢?
下面是我画的一个流程图,让大家更容易理解。
注:图中的地址是随意写的,实际肯定不是这样。
详解:
变量str是一个指针,该指针所在的地址是0x123,它所指向的是字符串@"aaa",字符串@"aaa"地址是0x999。str在传入函数后,函数的形参str是另一个空间0x456,并不是之前的变量str了,形参指向的是变量str所指向的空间0x999也就是字符串@"aaa"。
形参在函数内被赋值 str = @"bbb"; 此时形参0x456指向的就是字符串@"bbb"所在的内存地址0x777。函数外的变量str 0x123依然是指向地址0x999。 在出函数后,形参0x456因为没有引用计数,所以被释放回收。而变量str 0x123依然是指向地址0x999,值为@"aaa"。
网友评论