1

私は私を混乱させていた何かを修正しましたV2が、それでも何V1が行われているのかについて少し興味があります。V1今見て、私は線が値によって渡されていると思っています(つまり、基本的に私が持っているのは線のローカルコピーです)。次に、スキャナーはそのデータをそのローカルコピーのアドレスにスキャンします。メソッドが終了し、外部変数行がまだnilの場合、ローカルコピーは破棄されますか?

で、行のアドレスを渡してからそのV2アドレスにデータをスキャンしていますが、これは参照による受け渡しを使用していますか?用語がわかりませんか?

// V1
NSString *line = nil;
[self scanUsing:scanner into:line];
NSLog(@"AFTER_: %@", line);

- (void)scanUsing:(NSScanner *)scanner into:(NSString *)line {
    [scanner scanUpToString:@"\n" intoString:&line];
    NSLog(@"INSIDE: %@", line);
}

// V2     
NSString *line = nil;
[self scanUsing:scanner into:&line];
NSLog(@"AFTER_: %@", line);

- (void)scanUsing:(NSScanner *)scanner into:(NSString **)line {
    [scanner scanUpToString:@"\n" intoString:line];
    NSLog(@"INSIDE: %@", *line);
}
4

4 に答える 4

1

V1では、メソッドのスコープにのみ存在するローカルパラメーターの値を変更し、グローバル変数lineは変更しません。line

V2では、グローバルlineポインタを参照によって効果的に渡すことができます。これにより、その値を変更できます...

于 2012-10-11T10:32:57.507 に答える
1

これはC++ではないため、参照渡しと呼ぶことはできません。ただし、これをパスバイポインタと呼ぶことはできます。(これはまだ値によるものですが、ポインターを値によって渡しています。)

文法ナチとは別に:最初のバージョンは、のローカルコピーline(つまり、関数内のもの)のみを変更します。実際に渡したものは変更されません。

于 2012-10-11T10:29:40.417 に答える
1

V1

ポインタのコピーを渡しています。同じメモリ領域を指しているため、表示されるのは同じ値です。次に、オブジェクトを値で渡します。コンテンツを変更することはできますが、メソッドの終了時にそのポインタが存在しないため、新しいオブジェクトを作成することはできません。

V2

参照の定義は異なります(C ++タイプ)しかし、そうです、それが多かれ少なかれ同じように動作するとしましょう。V2では、メソッド内に新しいオブジェクトを割り当てることができるため、それが指すメモリ領域を変更できます。

それで:

  • V1、値渡し。ポインタを渡すと、ポインタが指すオブジェクトの内容を変更できます。
  • V2、参照渡し。ポインタをポインタに渡すので、メモリを割り当てることができるので、ポインタアドレスも変更できます。
于 2012-10-11T10:34:37.820 に答える
1

最初の例では、オブジェクトへの参照を渡しています。2番目の例では、オブジェクトの参照に参照を渡します。

最初の例でline-objectをログに記録すると、違いがわかりますが、2番目の例では、メソッド内に設定したオブジェクトが表示されます。

これは、基本的なリターンタイプがあるNSErrorでよく使用されますが、エラーが発生した場合にも通知する必要があります。次に、エラー変数へのポインターを渡し、NSErrorオブジェクトへの参照を渡します。これがあなたにとって少なくとも少し意味があることを願っています:)

于 2012-10-11T10:34:53.140 に答える