Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C-通过值和通过参考_Ios_Objective C_String_Parameter Passing - Fatal编程技术网

Ios 目标C-通过值和通过参考

Ios 目标C-通过值和通过参考,ios,objective-c,string,parameter-passing,Ios,Objective C,String,Parameter Passing,首先,很抱歉这个简单的问题。但我需要了解发生了什么 我认为输出应该是大写字符串。但结果却是大写字符串 - (void)test { NSString *stringVar = @"UPPER CASE STRING"; [self changeString:stringVar]; NSLog(@"value after changed : %@", stringVar); } - (void)changeString:(NSString*)string {

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

我认为输出应该是大写字符串。但结果却是
大写字符串

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

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
}

发生了什么以及如何修复它?

调用
[string lowercasesetring]
将创建一个新的
NSString
对象,您将该对象分配给局部变量
string
。这不会在
changeString
函数之外更改
stringVar
的值。指针本身通过值传递

执行所需操作的一种方法是将指针传递给指针:

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

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
}
-(void)changeString:(NSString*)string
中的字符串是局部变量,请修改方法以返回值:

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

如果查看对
[NSString lowercasesetring]
的引用,可以看到它返回一个新字符串,其中包含小写字符:

返回接收器的小写表示形式

- (NSString *)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
,它可以就地修改。

string
是一个局部变量(指向不可变的NSString的指针),您只需更改
string
在局部函数中指向的内容,但当您返回它的值时,它的值将被丢弃


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

我指的是上述给定的问题并帮助您解决错误。查找我的注释

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

将NSString分配给
Void
方法是一个错误,
Void
方法不会返回值对不起,我的错,cource返回值是“NSString*”,只是为了确保,即使在这种情况下,ARC也会透明地处理内存处理,对吗?亲爱的Greg,这意味着Objective C默认使用按值传递机制,对吗?@JoachimIsaksson:是的,ARC正确处理内存管理(如果编译器无法理解您在做什么,它将警告您)。@charith:是的,Objective-C中传递参数的语义与C中相同。