Monday, February 28, 2011

smart pointers for Core Foundation style references

iOS や mac のアプリケーションを書くときに Objective-C を使うときでも、 Core Graphics などの C の API を使うときは CGImageRef などのリファレンスの開放とか面倒です。特に関数の途中で return したり、C++ のライブラリを使用するときの例外処理を考えるとウンザリです。メモリリークのリスクも高まるし。


void doSomething(void) {
CGImageRef image = CGImageCreate(......);

// do something...

if (some condition...)
CGImageRelease(image);
return;
}

try {
CPlusPlusClass::aFunction()
} catch (...) {
CGImageRelease(image);
return;
}

// use image...

CGImageRelease(image);
}


Objective-C のオブジェクトなら最初に autorelease しておけばいいんですけどね(iOS でなければガベージコレクションも使えるし)。

そんなときは C++ のテンプレートで smart pointer 的なリファレンスのラッパーを書けば、ことあるごとに XXXXRelease(ref) しなくて済みます。


これで、こんなふうに書けるようになります。

#include "AutoRef.h"

void AutoRefRelease(CGImageRef ref) { CGImageRelease(ref); }

void doSomething(void) {
AutoRef image = CGImageCreate(......);

// do something...

if (some condition...)
return;
}

try {
CPlusPlusClass::aFunction()
} catch (...) {
return;
}

// use image...
}


Objective-C のコードで C++ のコード使う場合(Objective-C++)は、拡張子を .mm に変えるを忘れずに。

No comments: