Cocoaプロジェクトでは、malloc/freeを使用する場所がたくさんありました。しかし、数か月前、ARCを活用するためにリファクタリングすることにしました。そのために、自動的にクリーンアップされるものへのポインターを返すmallocの代わりを作成しようとしました。
この機能を使用しました(エラーチェックやその他のログは省略)
+ (void *) MallocWithAutoCleanup: (size_t) size
{
NSMutableData * mutableData = [[NSMutableData alloc] initWithLength:size];
void * data = [mutableData mutableBytes];
return data;
}
これはしばらくの間は正常に機能しましたが、最近、ランダムなメモリ上書きの問題が発生しました。この関数の原因を突き止めました。起こっているように見えるのは、mutableBytesへのポインターを保持しているにもかかわらず、NSMutableDataインスタンスの割り当てが解除されていることです。
これは、オブジェクトへの唯一の直接参照がローカルでなくなり、mutableBytesがオブジェクト内を指しているため、ARCがその種の参照カウントを処理するのに十分なほど賢くないために起こっていると思います。
mutableBytesポインターが使用されている(つまり、誰かがそれを参照している)限り、このコードをリファクタリングしてmutableDataオブジェクトを保持する方法はありますか?1つのオプションは、NSMutableData自体を返すことですが、これにはかなりのリファクタリングが必要であり、非常に面倒なようです。