4

私は Objective-C での逆参照を理解しようとしており、以下の 2 つの方法を書きました。

-(void)alterStringModelOne:(NSMutableString**)string{
    NSMutableString *str = [NSMutableString stringWithString:@"New string by string = &str"];

    string = &str; //Didn't work
}
-(void)alterStringModelTwo:(NSMutableString**)string{
    NSMutableString *str = [NSMutableString stringWithString:@"New string by *string = str"];

    *string = str; //It works
}

上記では、ModelOne は機能しませんでしたが、ModelTwo は機能します。これら2つのステートメントはどのように異なりますか?

編集:アドレスとタイプの追跡

myStr =タイプのb260 * CFString

---> メソッド モデル 1 に入る

string = d9c4 型 ** NSMutableString //パラメータ

str = f750 of * CFString //str 作成後

string = d97c of type ** NSMutableString //代入後: string = &str;

--> メソッドが戻る

myStr = b260 * CFString

--> メソッド モデル 2 に入る

string = d9c4 型 ** NSMutableString //パラメータ

str = 0bc0 of * CFString //str 作成後

string = 0bc0 of type * CFString //代入後: *string = str;

--> 葉の方法

myStr =タイプの0bc0 * CFString

4

2 に答える 2

4

まず第一に、これは Objective-C に固有のものではありません。C と C++ にも同じ動作があります。

string = &str;

これにより、ローカル変数の値が変更されますstring

*string = str;

これにより、 が指す値が変更されstringます。

はローカル変数であるためstring、(最初の例で見たように) それを変更しても永続的な効果はありません。ただし、それが指す値はローカルではないため、それを変更すると(2番目の例)、必要なことが行われます。

于 2013-01-24T01:07:39.887 に答える
0

これは C と同じように機能します。Objective-C オブジェクトはポインターによってアクセスされるため、次のようになります。

NSMutableString *string;

stringはオブジェクト構造へのポインターとして宣言されており、通常はそれを直接オブジェクトであるかのように操作します。次に、そのポインターのアドレスを渡しました。これは、オブジェクト自体と見なされます。何かのようなもの:

(NSMutableString **)string

実際には

((object)*)string

元のオブジェクトに何かを割り当てたい場合は、このstringポインターが指す値を使用する必要があります。それ自体ではありません (モデル 1 で発生するように)。そうしないと、アドレスが表すものではなく、ポインターが指すものを変更することになります。 . これが、2 番目のモデルが機能する理由です。strオブジェクトへのポインタである を、元のポインタ (つまり、ポインタが指すオブジェクト) の上に置きstringます。

これを行うときは、メモリ管理に注意してください。

于 2013-01-24T01:08:49.330 に答える