Cocos2d-x CCControlExtensionをLuaから使う
ってな事をちょっとやってみたのですが、、、。最終的にちょっと嫌な仕様になっちゃったのでやめておいたというお話。
CCControlはtarget object(CCObjectを継承したクラス)とselectorとイベントのマスクでイベントのハンドラを登録します。
内部では、それらをCCInvocationオブジェクトとして保持していますが、CCInvocationの中で対象となるObjectをretainしません。
GUIのイベントハンドラは自分自身に向ける事も多いので循環参照になりますし、
CCInvocationはtarget objectのownerであるとは限らないのでretainしないのはこれは正しい設計に思います。
ここまではNativeの話。ここからLuaで使う場合のはなしです。
Luaでイベントハンドラを実装したい場合、CCControlはスクリプトのハンドラを設定する事ができないため、
スクリプトを呼び出すHelper Objectを実装してHelper ObjectをLuaとBind、
イベントの発生を一旦このHelper Objectで受け、そこからスクリプトを呼び出す様にしてやりました。
ここで一つ問題が。Helper ObjectをCCControlの寿命と一致させる事が出来れば
スクリプトハンドラの削除をHelper Objectの削除タイミングで行えます。
しかしながら、Helper Object側でCCControlが削除された事を知る事ができません。
このためHelper ObjectのOwnerは別に用意して管理する必要が出てきます。うーん。面倒。
CCControlExtension側を書き換えちゃえばいいんですけどねー。
というわけでLuaからはCCControlExtensionは使わない方向で行こうと決めた、今日このごろなのでした。