2

何よりも、私の英語が完全に正しくない場合は申し訳ありません。それは私の母国語ではありませんが、私は自分自身をできる限り説明しようとします。

次の問題を理解するのに苦労しています。次のコードを考慮に入れてください。

// 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些細なことを見逃していることは知っていますが、それを見つけることができません。メカニズムの背後にある理由をよりよく理解するために、これを理解したいと思います。

ありがとうございました!

4

2 に答える 2

2

2番目のケースでは、そのポインターのローカルコピーを変更しています。呼び出し元のスコープでそれを再ポイントする場合は、ポインターへのポインターを使用する必要があります。

- (void)referenceTest:(NSMutableString **)originalText
{
    NSMutableString *newText = [NSMutableString stringWithString:@"Hello world!!!"];
    *originalText = newText;
}

そしてそれをこう呼んでください:

[myTest referenceTest:&myText];

また、stringWithStringは自動解放された文字列を返すことに注意してください。これは、関数もそうであることを意味します。

于 2013-02-04T17:18:53.367 に答える
0

オブジェクトとオブジェクトへのポインタには違いがあります。

誰かがNSMutableStringオブジェクトを作成しました。これは、メモリのどこかに存在します。私たちはそれがどこにあるかは本当に気にしません。誰かがNSMutableStringオブジェクトを指すNSMutableString*を受け取ったこと。そのNSMutableString*のコピーがメソッドreferenceTestに渡されました。そのNSMutableStringオブジェクトへのポインターはいくつでも存在できますが、オブジェクトは1つだけです。

appendStringメソッドは、NSMutableStringオブジェクト自体を変更します。

stringWithStringメソッドは、新しいNSMutableStringオブジェクトを作成し、そのオブジェクトへのポインターを返します。これで2つのオブジェクトができ、newTextは2番目のオブジェクトへのポインタになります。newTextをoriginalTextに割り当てると、originalTextは2番目のNSMutableStringオブジェクトへのポインターになります。ただし、originalTextはメソッドのパラメーターにすぎません。呼び出し元のメソッドが保持するポインターは、これによって変更されません。

于 2014-03-22T14:15:00.727 に答える