为什么NSString没有通过引用来回复?

时间:2012-06-13 19:22:27

标签: objective-c nsstring

我正在尝试通过调用方法来更改NSString类型的变量。但它不起作用。我尝试了与其他类型相同的方法,它工作得非常好。你能帮助我吗?

接口:

- (void) changeNSString: (NSString *) stringToChange;

实现:

- (void) changeNSString: (NSString *) stringToChange{

    stringToChange = @"Test";    
}

- (IBAction)actionBla:(id)sender {

    NSString *myString = [NSString string];
    [self changeNSString:myString];
    NSLog(myString);            //Returns nothing or empty string

}

====================== 编辑:感谢CrimsonDiego的帮助,这是一个有效的解决方案。虽然我仍然有一点理解问题:为什么在将NSMutableString分配给NSString var时没有类型错误?

接口:

- (void) changeNSMutableString: (NSMutableString *) stringToChange;

实现:

- (void) changeNSMutableString: (NSMutableString *) stringToChange{

    [stringToChange setString:@"Test"]    
}

- (IBAction)actionBla:(id)sender {

    NSMutableString *myString = [NSMutableString string];
    [self changeNSMutableString:myString];
    self.myLabel.text = myString;           //Why is there no type error???

}

3 个答案:

答案 0 :(得分:4)

您正在为函数中的局部变量分配一个新变量。

首先,局部变量stringToChange引用与myString相同的变量,但是当您将@“Test”分配给stringToChange时,它不再引用原始字符串。

这里的解决方案是使用NSMutableString,或者使用类变量(或属性)并使用它而不是将其传递给函数。

答案 1 :(得分:3)

您在功能中将stringToChange设置为本地。请尝试以下方法:

- (NSString*) changeNSString: (NSString *) stringToChange{

    stringToChange = @"Test";
    return stringToChange;
}

- (IBAction)actionBla:(id)sender {

    NSString *myString = [NSString string];
    myString = [self changeNSString:myString];
    NSLog(myString);            //Returns nothing or empty string

}

答案 2 :(得分:2)

我不是Objective-C的专家,但在我看来stringToChange,就像在“普通”C中一样,是一个可以包含指向字符串的指针的参数。该参数是按值传递的,因此,当您将@"Test"分配给stringToChange时,实际上只更改了本地参数stringToChange而不是myString。如果您想更改myString,则必须将参数类型更改为NSString **并将&myString作为参数传递。