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中相同。