2012-04-19 10 views
0

私はこのようなNSMutableArrayのにオブジェクトを追加している:オブジェクトがNSMutableArrayに追加されたインデックスを取得するにはどうすればよいですか?

[array addObject:myObject]; 

私は今、このオブジェクトが追加されました配列インデックスの私の代表団への参照を送りたいです。 後、私はそれのために戻って参照を取得するために

[array objectAtIndex:index] 

を呼び出すことができるように私のオブジェクトが配列に追加されましたインデックスを見つけるための簡単な方法はありますか?

ありがとうございます!

+0

オブジェクトを追加している間も、インデックスを与えることができます[array addObject:myObject atIndex:index]; – Charan

+0

@SreeCharan NSMutableArrayに 'addObject:atIndex:'メソッドはありません。あなたは '-insertObject:atIndex:'を意味しましたか? –

+0

ええ、申し訳ありません、そのinsertObject:atIndex: – Charan

答えて

2

オブジェクトのインデックス(間違っている可能性があります)をデリゲートに渡すのではなく、オブジェクト自体への参照を渡します。デリゲートが配列内のオブジェクトのインデックスを必要とする場合、アントニオMGが説明するように-indexOfObject:を使用してそれ自体を把握することができます。変更可能な配列内の任意のオブジェクトのインデックスは、オブジェクトの追加、挿入、および削除に応じて変更できます。一定期間にわたって有効な指標を数えることは、カウンターにゼリーサンドイッチを残すようなものです。バグを惹きつけるのは間違いありません。

0

はそのため、このメソッドを使用します。

index = [animalOptions indexOfObject:myObject]; 
+0

これは、新しいオブジェクトを配置するインデックス '-addObject: 'が何であるかをすでに知っている場合、配列全体を歩く必要があります。これは、インデックスを伝える予定がなく、配列が比較的小さく、オブジェクトの '-equalTo:'と '-hash'メソッドが健全であることを知っている場合にのみ役立ちます。 –

+0

@JasonCocoオブジェクトを追加してからそのインデックスを知りたいと思ったときに、何が問題になるかは完全にはっきりしていません。後者は前者の直後に起こるかもしれません。その場合、配列の 'count'を使って(少なくともいくつかの制約w.r.tを書いておいてください)、しかし再びそうではないかもしれません。 '-indexOfObject:'を使うことは、OPの質問に対する最も一般的で最も正しい直接的な答えです。また、NSArrayは、(あなたが期待していたように常に行動するとは限りませんが)(http://ridiculousfish.com/blog/posts/array.html)、ここの方法はそれほど悪くないかもしれません。 – Caleb

+0

@Calebええ、私はOPが別のコメントを投稿した後にそれを実現しました。しかし、その場合、OPはこれらのオブジェクトを追跡するためのよりよい方法を考えるべきです(おそらく、インデックスセットを使用してオブジェクトを配列に残すか、非常に大きい場合はNSNullインスタンスをスワップしてインデックスを削除します)インデックスセットから)。配列が常に期待通りの動作をするとは限りませんが、最悪の場合を想定しています(実際には配列の実装は実際にはこのように振る舞いますが、極端に巨大になります) –

0

最新の追加オブジェクトが[array count] - 1インデックスである必要があります。最後のインデックスを決定するために、常に "カウント-1"体系に頼ることができます。

-1

オブジェクトのインデックスを追加した直後はarray.count -1です。

+0

なぜ落選ですか? –

1

可変配列へのアクセスをシリアライズする必要があり、-addObject:は常に配列の最後にオブジェクトを追加します。これらの2つのアサーションがあると、次に追加されるオブジェクトのインデックスは常に配列の現在の長さになることがわかります。したがって、次のことが当てはまります:

NSUInteger nextIndex = [array count]; 
[array addObject:myObject]; 
// you can now tell your delegates that nextIndex is the index of myObject 
+0

はい..でももし私がすれば:{[array addObject:obj1]; [配列addObject:obj2]; [配列removeObject:obj1]; [array addObject:obj3]} obj3のインデックスが1ではなく0になることはありますか? – Fervus

+0

@Fervusはい、あなたが正しいです - インデックスが変わります。オブジェクトを参照するために可変配列内のオブジェクトのインデックスを使用しないでください。代わりにオブジェクト自体への参照を使用します。 – Caleb

+0

@Fervus各インデックスを最初に記録する必要があります。または、現在のカウントで開始し、オブジェクトを追加/削除する順序を知る必要があります。そのため、変更可能な配列へのアクセスをシリアル化する必要があります。配列をずらして移動する場合は、オブジェクトの位置を追跡する別の方法を見つける必要があります。 –

0

addObjectを呼び出す場合は、常に最後にオブジェクトを追加します(count - 1)。 "insertObject:atIndex:"を使用してインデックスを指定できます。 ご質問:indexOfObject:

関連する問題