メソッド名で戻り値を制御する - Automatic Reference Counting

SPECIAL


メソッド名で戻り値を制御する

メソッドに従来のような命名規則、getMethod や newMethod という名前を付けるとどうなるのでしょう。

このような名前で NS_RETURNS_RETAINED といった制御を付けずに動作を試してみたところ、getMethod の方は autorelease 的な動きを見せたのに対し、newMethod の方は retain 的な動きを見せました。

どちらとも、関数内では alloc & init したものを戻り値としてあったのですけど、ARC ではメソッド名(メソッドファミリ)によって、戻り値の状態を自動的に整えてくれる感じのようです。

 

ARC でメソッドファミリとして認識するキーワードとしては "alloc", "copy", "mutableCopy", "new", "init" があるようです。

これらの名前で始まるメソッドは、自動的に "NS_RETURNS_RETAINED" を付けたのと同じになるようですが、メソッドに明示的に "__attribute__((ns_returns_autoreleased))" 等を付けることで、そちらの動作に合わせることもできるようになっていました。

また、任意の名前のメソッド名に、上記のメソッドファミリ名を付けることもできるようになっています。この場合には、メソッド名の最後にたとえば "__attribute__((objc_method_family(new)))" と記述することで、そのメソッドを "new" メソッドファミリとして扱うことができるようでした。

ここまで細かく調整する必要があるかは分かりませんけど、とりあえずメソッドファミリ名によって戻り値の扱いが自動的に調整されるのは、Objective-C のメソッド名の流儀さえ抑えておけば、これもまたコーディングの負担が楽になるように思います。

 

名前によってこうするべきと決められているものが、名前を付ければ ARC で自動的にそうしてくれるというのは、名前付けからプログラミングが始まっていて、出来上がるものも矛盾がなくなるのがいいですね。

[ Automatic Reference Counting 目次へ ]