その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

ARC を有効にしているコードで NSZoneMalloc をどう置き換えればよいか

AVFoundation を用いたカメラアプリを実装していて、参考にしていたサンプルコードに次のような NSZoneMalloc を用いてメモリ確保している箇所がありました。

bitmap = NSZoneMalloc(self.zone, width * height * 4);


これを ARC オンにしているソースに書いてビルドすると、

'zone' is unavailable: not available in automatic reference counting mode


こんな「ARCではzoneプロパティは使えませんよ」エラーが。
(※zoneはNSObjectのプロパティ)


他の部分はARC前提で書いてるので、このソースファイルを非ARCにしたくない場合、ここをどうにか書き換える必要があります。

対処方法

結論としては、malloc() を使って書き換えます。


mallocは引数に確保すべきサイズを渡すだけなので、上記の例を書き換えると次のようになります。

//bitmap = NSZoneMalloc(self.zone, width * height * 4);
bitmap = malloc(width * height * 4);


解放する部分のコードも変わるので、ご注意ください。

//NSZoneFree(self.zone, bitmap);
free(bitmap);
bitmap = NULL;


(参考ページ)
http://stackoverflow.com/questions/10849251/replacing-usage-of-nszonemalloc-in-an-arc-enabled-ios5-app