何よりも、私の英語が完全に正しくない場合は申し訳ありません。それは私の母国語ではありませんが、私は自分自身をできる限り説明しようとします。
次の問題を理解するのに苦労しています。次のコードを考慮に入れてください。
// 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
最初の例のメソッドからポインタの内容と終わりを変更できる場合、2番目の例の同じメソッドからのreferenceTest:
アドレスを変更できないのはなぜですか?myText
NSError
些細なことを見逃していることは知っていますが、それを見つけることができません。メカニズムの背後にある理由をよりよく理解するために、これを理解したいと思います。
ありがとうございました!