33

配列を使用して、データベースからロードされたキャッシュオブジェクトをiPhoneアプリに保存していますが、疑問に思っていました。NSMutableArrayを使用することには、知っておくべき重大な欠点はありますか?

編集:NSMutableArrayを変更できることは知っていますが、代わりにNSArrayを使用する特定の理由(パフォーマンスなど)を探しています。パフォーマンスに違いがあると思いますが、それが重要かどうかはわかりません。

4

5 に答える 5

50

データベースからオブジェクトをロードしていて、オブジェクトの数が正確NSMutableArrayにわかっている場合、 sメソッドから最高のパフォーマンスが得られ、arrayWithCapacity:いっぱいになるまでオブジェクトを追加できるため、可能であれば一度にすべてのメモリが割り当てられます。

舞台裏では、それらは密かに同じものNSArrayであり、両方とも無料のブリッジングを介して s でNSMutableArray実装されています (aと aは同じものの typedef です)CFArrayCFMutableArrayRefCFArrayRef__CFArray * *

NSArrayNSMutableArray同じパフォーマンス/複雑さ (アクセス時間は最悪で O(lg N)、せいぜい O(1)) を持つ必要があり、唯一の違いは 2 つのオブジェクトが使用するメモリの量です -固定NSArrayの制限がありNSMutableArrayますが、使い切ることができますあなたが自由に持っている限りのスペース。

CFArray.hのコメントには、これに関する詳細が記載されています。

*: Catfish_Man が以下で指摘しているように、これはもはや真実ではありません。

于 2009-11-17T03:15:52.680 に答える
25

NSArray を使用する場合と NSMutable 配列を使用する場合のパフォーマンスの違いは、主に、配列をコピーする API を使用する場合に発生します。-copy を不変配列に送信すると、保持カウントが増えるだけですが、 -copy を可変配列に送信すると、ヒープ メモリが割り当てられます。

于 2009-11-17T05:37:50.927 に答える
14

さらに、NSMutableArrayはスレッドセーフではありませんが、NSArrayはスレッドセーフです(すべての可変オブジェクトと「不変」オブジェクトで同じです)。マルチスレッドを使用している場合、これは大きな問題になる可能性があります。

于 2009-11-17T13:36:25.437 に答える
9

の主な欠点NSMutableArrayは、NSMutableArray別のオブジェクトも所有している場合、 を所有するオブジェクトの背後で配列が変更される可能性があることです。これにより、オブジェクトをより防御的にコーディングし、積極的にパフォーマンスを追求する必要がなくなる場合があります。

NSMutableArrayがオブジェクトの外部に公開されていない場合、これは問題ではありません。

NSArrayは不変であるため、共有するのに適しています。それを使用するすべてのオブジェクトは、それが変更されないと想定でき、防御的にコピーを作成する必要はありません。

これはおそらくNSDictionary、単にキーを保持するのではなく、キーをコピーするのと同じ理由です。キーが変異しないことを確認する必要があり、コピーがそれを保証する唯一の方法です。

于 2010-10-12T22:15:31.300 に答える
2

NSArray一度作成すると変更できません。配列からオブジェクトを追加/削除する必要がある場合は、使用しますNSMutableArray-そのためのオプションはあまりありません。NSArray固定配列操作用に最適化されていると思います。可変配列は、柔軟に変更可能です。

于 2009-11-17T02:28:11.703 に答える