首先,抱歉这个简单的问题。但我需要了解正在发生的事情。
我认为输出应为 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];
}
发生了什么以及如何解决?
答案 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)
字符串是局部变量,修改方法返回值:
-(void) changeString:(NSString*)string
答案 4 :(得分:0)
string
是一个局部变量(一个指向NSString的指针,它是不可变的),你只是改变了string
指向本地函数的内容,但是当你返回它的值时会被抛出程。
您可能想要做的是简单地将字符串作为参数传递,并从函数中返回小写字符串。