配列を使用して、データベースからロードされたキャッシュオブジェクトをiPhoneアプリに保存していますが、疑問に思っていました。NSMutableArrayを使用することには、知っておくべき重大な欠点はありますか?
編集:NSMutableArrayを変更できることは知っていますが、代わりにNSArrayを使用する特定の理由(パフォーマンスなど)を探しています。パフォーマンスに違いがあると思いますが、それが重要かどうかはわかりません。
配列を使用して、データベースからロードされたキャッシュオブジェクトをiPhoneアプリに保存していますが、疑問に思っていました。NSMutableArrayを使用することには、知っておくべき重大な欠点はありますか?
編集:NSMutableArrayを変更できることは知っていますが、代わりにNSArrayを使用する特定の理由(パフォーマンスなど)を探しています。パフォーマンスに違いがあると思いますが、それが重要かどうかはわかりません。
データベースからオブジェクトをロードしていて、オブジェクトの数が正確NSMutableArray
にわかっている場合、 sメソッドから最高のパフォーマンスが得られ、arrayWithCapacity:
いっぱいになるまでオブジェクトを追加できるため、可能であれば一度にすべてのメモリが割り当てられます。
舞台裏では、それらは密かに同じもの *NSArray
であり、両方とも無料のブリッジングを介して s でNSMutableArray
実装されています (aと aは同じものの typedef です)CFArray
CFMutableArrayRef
CFArrayRef
__CFArray *
NSArray
NSMutableArray
同じパフォーマンス/複雑さ (アクセス時間は最悪で O(lg N)、せいぜい O(1)) を持つ必要があり、唯一の違いは 2 つのオブジェクトが使用するメモリの量です -固定NSArray
の制限がありNSMutableArray
ますが、使い切ることができますあなたが自由に持っている限りのスペース。
CFArray.hのコメントには、これに関する詳細が記載されています。
*: Catfish_Man が以下で指摘しているように、これはもはや真実ではありません。
NSArray を使用する場合と NSMutable 配列を使用する場合のパフォーマンスの違いは、主に、配列をコピーする API を使用する場合に発生します。-copy を不変配列に送信すると、保持カウントが増えるだけですが、 -copy を可変配列に送信すると、ヒープ メモリが割り当てられます。
さらに、NSMutableArrayはスレッドセーフではありませんが、NSArrayはスレッドセーフです(すべての可変オブジェクトと「不変」オブジェクトで同じです)。マルチスレッドを使用している場合、これは大きな問題になる可能性があります。
の主な欠点NSMutableArray
は、NSMutableArray
別のオブジェクトも所有している場合、 を所有するオブジェクトの背後で配列が変更される可能性があることです。これにより、オブジェクトをより防御的にコーディングし、積極的にパフォーマンスを追求する必要がなくなる場合があります。
NSMutableArray
がオブジェクトの外部に公開されていない場合、これは問題ではありません。
NSArray
は不変であるため、共有するのに適しています。それを使用するすべてのオブジェクトは、それが変更されないと想定でき、防御的にコピーを作成する必要はありません。
これはおそらくNSDictionary
、単にキーを保持するのではなく、キーをコピーするのと同じ理由です。キーが変異しないことを確認する必要があり、コピーがそれを保証する唯一の方法です。
NSArray
一度作成すると変更できません。配列からオブジェクトを追加/削除する必要がある場合は、使用しますNSMutableArray
-そのためのオプションはあまりありません。NSArray
固定配列操作用に最適化されていると思います。可変配列は、柔軟に変更可能です。