Objective-C的函数NSString参数传递

最近看到一篇Objective-C中的值传递和引用传递文章,做下记录

先看代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  
  NSString *str = @"HelloWorld";
  NSLog(@"调用前 str=%@,对象地址=%p,指针地址=%p \n",str,str,&str);
  [self changeMyStr:str];
  NSLog(@"调用后 str=%@,对象地址=%p,指针地址=%p \n",str,str,&str);
};

- (void)changeMyStr:(NSString *)str {
    NSLog(@"方法执行前 str=%@,对象地址=%p,指针地址=%p \n",str,str,&str);
    str = @"Nihao";
    NSLog(@"方法执行后 str=%@,对象地址=%p,指针地址=%p \n",str,str,&str);
}
复制代码

执行结果:

调用前 str=HelloWorld,对象地址=0x106705130,指针地址=0x310967878
方法执行前 str=HelloWorld,对象地址=0x106705130,指针地址=0x3109677b0
方法执行后 str=Nihao,对象地址=0x1067051b0,指针地址=0x3109677b0
调用后 str=HelloWorld,对象地址=0x106705130,指针地址=0x310967878
复制代码

可以看到,str的值并不会改变。从结果看出:
①在调用前和赋值方法执行前,str指向的对象地址是一致的,说明指向同一个对象;但是指针地址不一致,说明调用前的str指针和参数的str指针不是同一个,即它们是两个指针,只是都指向了同一个对象。
②在赋值方法执行前和执行后,str指向的对象地址不一致,说明str指向了一个新的对象(即@"Nihao")

内存模型

个人理解:NSString *str传递的是一个指针,不是变量,不能理解为C语音中的引用传参。指针也是值传递,所以参数的指针变量和外面的指针变量不是同一个(代码执行结果的“指针地址”验证了这一点),只是在没有给函数里面的指针赋值前,它们都指向同一个地方。

如有谬误,欢迎斧正,共同进步

Guess you like

Origin juejin.im/post/7075156717356449823