一个变量传入方法中更改值,为何出方法后值没变?经典面试题图解

140 阅读1分钟
原文链接: www.jianshu.com
NSString *str = @"aaa";
[self change:str];
NSLog(@"%@",str);

- (void)change:(NSString *)str {
    str = @"bbb";
}

这道经典的面试题,打印结果是aaa,不是我们想象中的bbb。

那为什么会这样呢?

下面是我画的一个流程图,让大家更容易理解。
注:图中的地址是随意写的,实际肯定不是这样。

1563507797824.jpg

详解:

变量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"。