オブジェクトへのポインターを格納するだけの配列を宣言する方法がわかりません。私の理解によると、メソッドを使用する場合
[ someArray addObject:someObject ] ,
次に、オブジェクトのコピーを配列に追加し、オブジェクトへの変更は元のオブジェクトに反映されません。
私が望むのは、オブジェクトを指すだけのポインターの配列を作成し、オブジェクトに加えられた変更が持続することです。基本的なものが欠けている場合は、ご容赦ください。
オブジェクトへのポインターを格納するだけの配列を宣言する方法がわかりません。私の理解によると、メソッドを使用する場合
[ someArray addObject:someObject ] ,
次に、オブジェクトのコピーを配列に追加し、オブジェクトへの変更は元のオブジェクトに反映されません。
私が望むのは、オブジェクトを指すだけのポインターの配列を作成し、オブジェクトに加えられた変更が持続することです。基本的なものが欠けている場合は、ご容赦ください。
...メソッドを使用する場合
[ someArray addObject:someObject ] ,
次に、オブジェクトのコピーを配列に追加し、オブジェクトへの変更は元のオブジェクトに反映されません。
技術的には質問とは関係ありませんが、用語を修正する必要があります。Objective-C の「コピー」は、メソッド-copy
がオブジェクトに送信され、それ自体で新しいオブジェクトが作成されることを意味します。配列が行うことは、そのオブジェクトに送信-retain
することです。つまり、配列自体がオブジェクトのステークを所有するようになったことを意味します。これが、配列を参照しない変更 ( -objectAtIndex:
)、またはオブジェクト自体への有効な主張を持たない変更が反映されない理由です。
私が望むのは、オブジェクトを指すだけのポインターの配列を作成し、オブジェクトに加えられた変更が持続することです。基本的なものが欠けている場合は、ご容赦ください。
残念ながら、iOS はクラスNSPointerArrayをサポートしていません。これにより、ポインターの実際の配列に関して非常に簡単になります。C に夢中になることなく、上記のことを繰り返すことしかできません。配列内のオブジェクトを変更する必要がある場合は、それへの有効な参照でアクセスするか、-objectAtIndex
. オブジェクトに対する有効なクレーム (この場合は参照、送信されたためポインターは変更されていません-retain
) がある限り、それを変更できます。以下の簡単な例に注意してください。
NSMutableString *str = [[NSMutableString alloc]initWithString:@"Hello"];
NSArray *arr = [[NSArray alloc]initWithObjects:str, nil];
NSLog(@"%@",arr);
[str appendString:@" Friend!"];
NSLog(@"%@",arr);
これは以下を出力します:
2012-08-07 21:37:46.368 .MyApp[2325:303] (
Hello
)
2012-08-07 21:37:46.369 .MyApp[2325:303] (
"Hello Friend!"
)
単純!
あなたは基本が間違っています。技術的には、それを行うと、それらのオブジェクトへのポインターの配列が作成されます。
オブジェクトをコピーしたい場合は、明示的にそう言わなければなりません。
たとえば、この質問を見てください
ちなみに、NSMutableArray を使用する必要があります。
スーパークラス NSArray も見てください
具体的には、initWithArray:copyItems:
国旗
YES の場合、配列内の各オブジェクトは copyWithZone: メッセージを受け取り、オブジェクトのコピーを作成します。オブジェクトは NSCopying プロトコルに準拠する必要があります。マネージ メモリ環境では、これはオブジェクトが受信する保持メッセージの代わりになります。オブジェクトのコピーは、返された配列に追加されます。
NO の場合、マネージ メモリ環境では、配列内の各オブジェクトは、返された配列に追加されるときに保持メッセージを受け取るだけです。
デフォルトでは、オブジェクトを nsmutablearray に追加すると、必要に応じてその容量が増加し、オブジェクトの保持が追加され、オブジェクトへのポインターが追加されます。