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

时间:2012-07-31 09:55:58

标签: ios objective-c string parameter-passing

首先,抱歉这个简单的问题。但我需要了解正在发生的事情。

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

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

5 个答案:

答案 0 :(得分:58)

[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];
}

答案 1 :(得分:7)

如果您查看对[NSString lowerCaseString] method的引用,您会看到它返回一个新字符串,并带有小写字符:

  

返回接收器的小写表示。

- (NSString *)lowercaseString

您的代码所做的只是使用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;
}

您需要了解NSString是不可变的,因此除了重新分配引用之外,没有办法更改字符串的内容。但是,您可以使用NSMutableString代替,可以对其进行修改。

答案 2 :(得分:1)

我指的是上面给出的问题,并帮助你解决错误。找到我的意见

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

答案 3 :(得分:0)

<{1}}中的

字符串是局部变量,修改方法返回值:

-(void) changeString:(NSString*)string

答案 4 :(得分:0)

string是一个局部变量(一个指向NSString的指针,它是不可变的),你只是改变了string指向本地函数的内容,但是当你返回它的值时会被抛出程。

您可能想要做的是简单地将字符串作为参数传递,并从函数中返回小写字符串。