美文网首页iOS开发记录
一个变量传入方法中更改值,为何出方法后值没变?经典面试题图解

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

作者: 夜凉听风雨 | 来源:发表于2019-07-19 11:45 被阅读55次
    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"。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/rqsjlctx.html