首先,对不起,如果我的英语不是绝对正确。这不是我的母语,但我会尽力解释自己。
我很难理解以下问题。考虑以下代码:
// On a class named SPOTest
- (void)referenceTest:(NSMutableString *)originalText
{
[originalText appendString:@" world!!!"]
}
// From another place
NSMutableString *myText = [NSMutableString stringWithString:@"Hello"];
NSLog(@"Contents of myText BEFORE: %@", myText);
SPOTest *myTest = [[SPOTest alloc] init];
[myTest referenceTest:myText];
NSLog(@"Contents of myText AFTER: %@", myText);
输出:
Contents of myText BEFORE: Hello
Contents of myText AFTER: Hello world!!!
我觉得可以理解。我正在使用指针,所以如果我改变事物和指针的结尾,我会为所有指向它的指针改变那个事物。另一方面,如果我更改代码并执行此操作:
// On a class named SPOTest
- (void)referenceTest:(NSMutableString *)originalText
{
NSMutableString *newText = [NSMutableString stringWithString:@"Hello world!!!"];
originalText = newText;
}
// From another place
NSMutableString *myText = [NSMutableString stringWithString:@"Hello"];
NSLog(@"Contents of myText BEFORE: %@", myText);
SPOTest *myTest = [[SPOTest alloc] init];
[myTest referenceTest:myText];
NSLog(@"Contents of myText AFTER: %@", myText);
然后我得到这个:
Contents of myText BEFORE: Hello
Contents of myText AFTER: Hello
这是为什么?我想正确的方法是使用双重间接和类似于NSError
机制使用的实现,但我想了解为什么我会获得这种行为。如果我可以从第一个示例中的方法更改内容和myText
指针的结尾referenceTest:
,为什么我不能myText
从第二个示例中的相同方法更改地址?
我知道我遗漏了一些微不足道的东西,但我找不到它,我想理解这一点以更好地理解NSError
机制背后的推理。
谢谢!