Objective-C/iPhone アプリで従来の malloc()/free() を使用しても問題ありませんか?

同様のタスクによく使用するのが好きな、生メモリの周りの Objective-C ラッパーがあります:NSMutableData .所有権を保持/解放できるという利点があり、さらに配列を簡単に拡張できます (自分で再割り当てを行う必要はありません)。

コードは次のようになります:

NSMutableData* data = [NSMutableData dataWithLength:sizeof(int) * 100];
int* array = [data mutableBytes];
// memory is already zeroed

// use the array

// decide later that we need more space:
[data setLength:sizeof(int) * 200];
array = [data mutableBytes]; // re-fetch pointer in case memory needed to be copied

// no need to free
// (it's done when the autoreleased object is deallocated)

まったく問題ありません。Objective-C は C の厳密なスーパーセットであるため、単純な C を書きたい場合は、そうすることを妨げるものは何もありません。多くの場合、malloc を使用すると有利です。 と free Objective-C ランタイムのオーバーヘッドを回避します。

たとえば、不明な数の整数の配列を動的に割り当てる必要がある場合は、多くの場合、より単純で簡単です:

int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);

対:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:N];
// use NSMutableArray methods to do stuff with array; must use NSNumbers instead
// of plain ints, which adds more overhead
...
[array release];

私は iPhone 用の単語ゲームに取り組んでいましたが、有効な単語の数メガバイトの辞書をロードする必要がありました。単語リストは 1 つの巨大な char にロードされました malloc() で割り当てられた配列 、メモリサイズをさらに削減するためのいくつかの巧妙な最適化を備えています。明らかに、このようなものでは、 NSArray を使用するオーバーヘッド 限られたiPhoneではまったく実用的ではありません。オーバーヘッドが正確にはわかりませんが、確かに 1 文字あたり 1 バイト以上です。


もちろん、できます Objective-C は単に C のスーパーセットであるため、これらの関数を使用します。しかし、Objective-C にはオブジェクトとこれを容易にする方法が含まれているため、この種のことを行うことはかなりまれです。

結局、上記のコードは次のように書くことができます:

NSMutableArray *array = [[NSMutableArray alloc] init];

//Use the array, adding objects when need be

[array release];

NSNumber を作成する必要がありますが int を格納するオブジェクト s (NSArray 以降 オブジェクト以外の型を追加することはできません)、一般的にオブジェクトを使用する方が一般的です。これは、データの移動が容易であり、配列クラスが他の Cocoa クラスとより一般的に統合され、メモリ管理が一般的に行われるためです。標準の C メモリ管理よりも簡単です。

また、配列に対してオブジェクトの追加または削除を開始する場合、Cocoa 配列オブジェクトを使用すると、これがはるかに簡単になります。