私はまだすべての答えを読んで完全な画像を得ることができませんでした。私が下で行った平凡な練習は、最終的に何が起こっているのか理解するのを助けました。他の初心者に役立つように、そこに置いてください。
では、次の手順
ClassX *objectX = [[ClassX alloc] init];
NSMutableArray *arrayXX = [@[@(1), @(2)] mutableCopy];
//What is stored in arrayXX is the address in the heap at which the NSMutableArray object starts, lets call this address ZZZ
//array starting at address ZZZ in the heap now contains NSNUmbers @1,@2
[objectX methodX:array]
あなたが[objectX methodX:array]
を起動すると、どのような方法で受信されていることコピーであるを持っているあなたは、コードのいくつかの他の部分では
@interface Class X
-(void) methodX:(NSMutableArray *)array;
@end
を以下していると仮定しますのarray
。配列にはアドレス(すなわちポインタ)が含まれているので、コピーは、受け取ったものがアドレスZZZを持つ別の変数であるという点で特別です。
したがって、methodXが[array removeObjectAtIndex:0]
の場合、アドレスZZZから始まるオブジェクトは影響を受けます(現在は1つのNSNUmber @(2)しか含まれていません)。したがって、メソッドが返ってくると、元の配列も影響を受けます。
代わりにmethodXがarray = [@[@(2)] mutableCopy];
であると仮定すると、元の配列は影響を受けません。これはあなたが住所ZZZに行って何かを変更しなかったからです。代わりに、のコピーにZZZを上書きして、別のアドレスYYYに送信しました。 YYYアドレスは、1つの要素NSNUmber @(2)を持つNSMUtableArrayオブジェクトの先頭です。元のZZZアドレスにはまだ2つの要素を持つNSMUtableArrayが含まれています。 @(1)と@(2)。したがって、メソッドが返るとき、元の配列は影響を受けません。
こんにちは、ピーター:-)私はあなたが新年のスタートを切ってくれることを願っています。 '**'について 'C 'をブラッシングしながら、私はこのポストにここに上陸しました。すみません、私はまだそれを取得していません:オブジェクトにポインタを1つだけ '*'渡した場合、オブジェクトに変更するだけで十分でしょうか?オブジェクトを変更するために、オブジェクトへのポインタへのポインタを渡す必要があるのはなぜですか?非常に前もってありがとう。よろしく。 – Unheilig
@Unheilig: "もしオブジェクトにポインタを1つだけ渡したら、オブジェクトに変更を加えるだけで十分でしょうか?"そのオブジェクトにメッセージを送信するには、オブジェクトへのポインタが必要です。 "なぜオブジェクトに変更を加えるためにオブジェクトへのポインタへのポインタを渡す必要があるのでしょうか?"あなたはオブジェクトを変更していないので、新しいオブジェクトを作成して呼び出し元に返します。呼び出し元が指定したアドレスに割り当てることで、ポインタをオブジェクトに渡す変数へのポインタを指定します。 –
+1。これもクリアしていただきありがとうございます。 – Unheilig