NSMutableArray追加オブジェクトとしてのポインタのみですか?
-
22-08-2019 - |
質問
私はこの小さなコード
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithDouble:752.65];
[myArray addObject:myNumber];
このコードとステレオフォーンジャッジの内部配列の型になります。今はこんなものがあるようでは、二つのオブジェクトから独立した。
を変更した場合、購入したmyNumber後で追加された配列の値の配列は変わりません。たいのですがアーカイブす。また、ポインタのみの配列されていたものではなかった。
解決
つけることが出来ません、 変数 配列には、その myNumber
:た変数に格納されます。変数はコンテナな配列である;その違いは、変数はもはずせないオブジェクト*のように、この配列は、できるだけオブジェクト配列。
うまめ addObject:
なに可変 myNumber
, ものの、オブジェクトを作成する事で起動します。その追加の配列になります。
追加、変数の代わりにオブジェクト内で、必要な addObject:&myNumber
, にするためには、変数へのポインタです。がんの原因
- 申し上げたように、ウイルスの変数がオブジェクトではない、できるだけの追加オブジェクト。
- これはローカル変数で自然エネルギーの未来を切り開き、関数が終了;しかし、ポインタを死のメモリ内で配列に格納します。ときにアクセスなのでポインタ、プログラムは暴落する。
あるソリューション作品:
- としてf3lixとを可変数のクラスを作成し数オブジェクトからこのクラスの代わりにNSNumber.する必要がありまオーバーライドすべてのプリミティブ方法のNSValueに記載のとおり のNSNumber書.
- 代替のオブジェクトの配列の代わりにひとつのメカニズムです。もちろん、これを配列にアクセス至る所からす変更したい多くの注目を集めています。
- モデルを作成するオブジェクトのクラスになるといわれています。
この最後の溶液が、私の見解をすることから始まったのだ。ろまの管理のみのリスト番号ができ、ユーザーのリストをもとにしています。このモデルコードで、あらゆるものが多くより簡単になります。
コードに交換後の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];
}
*いやーます。C言語は一切呼び出しのポインタ,int等の"オブジェクト"、これは異なる定義で設定します。
他のヒント
あなたの問題をするNSNumberオブジェクトは、の不変ののであるということです。あなたはそれらの値を変更することができないことを意味します。だから、値を変更するためには、新しいのNSNumberオブジェクトを作成する必要があります。例えばます:
myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]
さて、もちろんあなたは配列に追加とは別のオブジェクトへのmyNumberポイントを持っています。だから、変更のNSNumberオブジェクトを置き換えることにより、配列を更新する必要があります:
[myArray replaceObjectAtIndex:0 withObject:myNumber]
さて、これはあなたが配列を更新することができるようにするために一緒にそれぞれのNSNumberとインデックスを格納する必要があり、問題が残ります。これはあなたの周りのNSNumberオブジェクトを渡し、値を変更できるようにしたい場合はincovenientです。
あなたは透明の更新を可能にするためにするNSNumberを包み込むラッパーオブジェクトを導入することで、この問題を解決できるか、あなたは自分のdoubleValueを処理する独自のクラス(多少変更可能なのNSNumberクラス)を作成することができます。
、配列に格納された値は変更されません。しかし、配列に格納されたポインタはmyNumberのコピーがあるので、それは同じオブジェクトだから、あなたがオブジェクトにmyNumberポイントが配列の要素点は、その変更が反映されますすることにオブジェクトを変更した場合。
あなたがやりたいように見えることは別のオブジェクト(あなたがmyNumberを変更するたび)に配列ポイントを作ることです。あなたは-replaceObjectAtIndex例えば、使用して手動でこれを行う必要があるでしょう:withObject :,そうのように:
NSNumber *myNumber = [NSNumber numberWithDouble: 3.141592];
int myNumberIndex = [myArray count];
[myArray addObject: myNumber];
myNumber = ...; //whatever
[myArray replaceObjectAtIndex: myNumberIndex withObject: myNumber];
このコードは何、基本的に、あなたはmyarrayのに入れ、その後、新しいものと、そのオブジェクトを置き換えるオブジェクトのインデックスを格納している。
NSPointerArray
... のような何かをしたいようにこれは聞こえます
NSPointerArrayはおそらく、(これらの)特殊なコレクションクラスの最も強力なの一つです。これは、指定します
あなたがメソッドのNSArray
のようなインターフェースが、NULL値(及び任意のポインタ)の挿入を可能にします。さらに、特定のオプションを指定してインスタンスを作成する場合NSPointerArray
、あなたはその中に保存されているオブジェクトに関して特定のメモリ管理ポリシーを持っているあなたのアレイを構成することができます。-initWithOptions:
や-initWithPointerFunctions:
を使用して、それを作成するときにあなたはNSPointerArrayのインスタンスのオプションを指定します。この方法を使用する場合 -initWithOptions: `、あなたが作成している配列は、パラメータとして渡しているオプションによって定めたポリシーを遵守することを指定しています。ビット単位-ORを使用して指定されたオプションは、アレイの特定のポリシーまたは「個性」に設定します。
それは...
に行きますあなたはNSPointerArray
にこのインスタンスを渡すと、、それを取り除き、オブジェクトが挿入されたとき、あなたが定義した関数を使用します、というように、通常の代わりに解放し、維持し、およびで使用される他の方法通常
NSArray
ます。