Objective C - 按值传递并通过引用传递

Cha*_*sha 25 string objective-c parameter-passing ios

首先,抱歉这个简单的问题.但我需要了解发生了什么.

我认为输出应该是upper case string.但它出来了UPPER CASE STRING.

- (void)test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
}
Run Code Online (Sandbox Code Playgroud)

发生了什么以及如何解决它?

Gre*_*ill 59

[string lowercaseString]调用将创建一个分配给局部变量的 NSString对象string.这不会改变函数stringVar外部的changeString值.指针本身按值传递.

做你想要的一种方法是将指针传递给指针:

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:&stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
}
Run Code Online (Sandbox Code Playgroud)

  • @charith:是的,Objective-C中传递的参数的语义与C中的相同. (3认同)

tro*_*foe 7

如果查看[NSString lowerCaseString] 方法的引用,可以看到它返回一个带有小写字符的新字符串:

返回接收器的小写表示.

- (NSString *)lowercaseString
Run Code Online (Sandbox Code Playgroud)

你的代码所做的只是用lowercaseString调用的输出覆盖输入字符串的引用,这没有任何效果.解决此问题的最佳方法是让您自己返回值,这使方法更容易理解:

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     stringVar = [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(NSString *) changeString:(NSString*)string
{
     string = [string lowercaseString];
     return string;
}
Run Code Online (Sandbox Code Playgroud)

您需要了解这NSString是不可变的,因此除了重新分配引用之外,没有办法更改字符串的内容.但是NSMutableString,您可以使用,可以在适当的位置进行修改.