変数を配列に入れることはできません。それmyNumber
が変数です。変数はコンテナであり、配列もコンテナです。違いは、変数は配列のようにオブジェクト*でもなく、オブジェクトのみを配列に入れることができることです。
渡すaddObject:
のは変数myNumber
ではなく、含まれるオブジェクトです。それが配列に追加しているものです。
addObject:&myNumber
内部のオブジェクトの代わりに変数を追加するには、変数自体へのポインターを渡すために、を実行する必要があります。しかし、次の 2 つの理由から、これは機能しません。
- 前述したように、変数はオブジェクトではなく、追加できるのはオブジェクトのみです。
- これはローカル変数であるため、関数が終了すると消滅します。次に、配列内のデッドメモリへのポインタがあります。そのポインターにあるものにアクセスしようとすると、プログラムがクラッシュします。
機能する 3 つのソリューションがあります。
- f3lix が示唆するように、変更可能な数値クラスを作成し、NSNumber の代わりにこのクラスから数値オブジェクトを作成します。NSNumber のドキュメントで説明されているように、NSValue のすべてのプリミティブ メソッドをオーバーライドする必要があります。
- オブジェクトを変更する代わりに、配列内のオブジェクトを置き換えます。もちろん、これには、数値を変更したいすべての場所から配列にアクセスできる必要があります。
- 数をプロパティとして持つモデル オブジェクト クラスを作成します。
私の意見では、最後の解決策は正しいものです。数字のリストだけを管理しているとは思えません。多くの場合、プロパティとして数値を持つもののリストをユーザーに表示しています。これをコードでモデル化すると、すべてがはるかに簡単になります。
裸の NSNumbers をモデル オブジェクトに置き換えた後のコードは次のようになります。
MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];
//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
[obj setNumber:1000.0];
}
※Cocoaオブジェクトのことです。C 言語では、ポインター、int などを「オブジェクト」と呼びますが、これは別の定義です。