Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Objective c 为什么不是';NST字符串通过引用应答呼叫?_Objective C_Nsstring - Fatal编程技术网

Objective c 为什么不是';NST字符串通过引用应答呼叫?

Objective c 为什么不是';NST字符串通过引用应答呼叫?,objective-c,nsstring,Objective C,Nsstring,我试图通过调用一个方法来更改NSString类型的变量。但它不起作用。我在其他类型的人身上尝试了同样的方法,效果非常好。你能帮我吗 接口: - (void) changeNSString: (NSString *) stringToChange; - (void) changeNSMutableString: (NSMutableString *) stringToChange; 实施: - (void) changeNSString: (NSString *) stringToChange

我试图通过调用一个方法来更改NSString类型的变量。但它不起作用。我在其他类型的人身上尝试了同样的方法,效果非常好。你能帮我吗

接口:

- (void) changeNSString: (NSString *) stringToChange;
- (void) changeNSMutableString: (NSMutableString *) 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

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

}
======================
编辑:多亏了CrimsonDiego的帮助,这里有一个有效的解决方案。尽管我仍然有一个小小的理解问题:为什么将NSMutableString分配给NSString变量时没有类型错误

接口:

- (void) changeNSString: (NSString *) stringToChange;
- (void) changeNSMutableString: (NSMutableString *) 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

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

}

将新变量指定给函数中的局部变量

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


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

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

您的设置
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

}

这在技术上是绝对正确的,但应该注意的是,按照惯例,指针指向指针技术只应在Cocoa中非常特定的情况下使用,而这不是其中之一。我认为这不是真的,因为Objective C中的所有对象都是指针。这就是为什么他说这在技术上是绝对正确的。这是可行的,没错,但是Cocoa惯例规定您应该避免这样的行为。因此我想,局部变量
stringToChange
myString
之间的引用被破坏的原因是,该NSString是不可变的?这并不是因为该字符串是不可变的-如果您将“NSString”替换为“NSMutableString”,也会发生同样的情况-发生的情况是,
stringToChange
myString
是两个单独的变量,它们最初引用相同的对象。当您将@“Test”分配给
stringToChange
变量时,您没有编辑旧对象。您正在将新对象分配给
stringToChange
变量,而不更改旧对象。如果您想使用NSMutableString,只需在changeNSString函数中说:
[stringToChange setString:@“Test”]
。我仍然有一个小小的理解问题:为什么将NSMutableString分配给NSString变量时没有类型错误?NSMutableString是NSString的子类,因此NSMutableString是NSString的子类,这是一种专门的方法。这实际上是另一种很好的方法。向上投票。Sorta——它实际上并没有改变任何字符串。它会更改引用。虽然这是可行的,但有点不尽人意。