目标C – 按价值传递,并通过参考传递

首先,对于这个简单的问题感到抱歉。 但是我需要了解发生的事情。

我认为输出应该是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]; } 

发生了什么事以及如何解决这个问题?

[string lowercaseString]调用将创build一个新的 NSString对象,并将其分配给本地variablesstring 。 这不会更改changeString函数外部的stringVar的值。 指针本身是通过值传递的。

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

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

如果您查看对[NSString lowerCaseString] 方法的引用,则可以看到它返回一个新的string,其中包含小写字母:

返回接收器的小写表示。

 - (NSString *)lowercaseString 

你的代码所做的只是用输出的lowercaseString调用覆盖对inputstring的引用,这没有任何作用。 解决这个问题的最好方法是让你自己回报价值,这使得这个方法更容易理解:

 -(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; } 

您需要了解NSString是不可变的,除了重新指定引用外,没有办法更改string的内容。 你可以,但是使用NSMutableString而不是可以修改的地方。

我指的是上面给出的问题,并帮助你的错误。查看我的意见

 - (void)test { NSString *stringVar = @"UPPER CASE STRING"; //StringVar is a pointer to integer class.let us assume the address the stringVar be 0x50 and the value it has be 0x100 //So 0x100 has the string [self changeString:stringVar]; //above we are calling the method to lowercase and argument is stringVar //As the method is called we pass 0x100 in the argument as this is the memory where the value is kept NSLog(@"value after changed : %@", stringVar); //Our StringVar still points to 0x100 where the value is in upperString } - (void)changeString:(NSString*)string { string = [string lowercaseString]; // Now operation performed on string returns a new value on suppose location 0x200 //String parameter passed in argument is assigned the new value.But we never pass values as we pass only location under the hood //New parameter passed now points to new memory location 0x200 } --------------------------------------------------------------------------------- With the new solution -(void) test { NSString *stringVar = @"UPPER CASE STRING"; //let 0x50 be stringVar memorylocation pointing to 0x100 with above value [self changeString:&stringVar]; //0x50 is passed in argument NSLog(@"value after changed : %@", stringVar); //On new location stored in address of stringVar it points to new string value } -(void) changeString:(NSString**)string { *string = [*string lowercaseString]; //0x200 is new memory location received.*string gives the 0x100 location and hence the value //LHS is assigned to new location .On LHS you find *string which will be assigned 0x200 //As string with location 0x50 is value 0x200 which will make it to point new location where lowercase string exist } 

string是一个局部variables(一个指向NSString的指针,它是不可变的),你只是改变了什么string指向本地函数,但是当你返回它的值将被扔掉。

你可能想要做的只是传递string作为参数,并从函数返回小写string。

string在-(void) changeString:(NSString*)string是局部variables,修改方法返回值:

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