定义消息回调类MessagePushEntry,该类尽量遵循cocos2d-x的数据结构和规范,主要有回调对象,回调方法及用来遍历的链表数据结构。
private:
MessagePushEntry(const char* key,CCObject *target,SEL_MsgCallFuncO selector);
public:
~MessagePushEntry();
private:
#define MAX_KEY 256
char msgKey[MAX_KEY];
CCObject *target;
SEL_MsgCallFuncO selector;
public:
UT_hash_handle hh;
};
SEL_MsgCallFuncO是自己定义的一个回调宏,接受回调数据,msgKey是注册的过滤条件。
#define msgcallfuncO_selector(_SELECTOR) (SEL_MsgCallFuncO)(&_SELECTOR)
下面是注册回调
if(target==NULL)
return;
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,key.c_str(),pElement);
if(pElement==NULL){
target->retain();
pElement=new MessagePushEntry(key.c_str(),target,selector);
HASH_ADD_STR(m_messagePush,msgKey,pElement);
}
return;
}
上面这些就是注册回调的大致实现,然后就是在适当时候去触发回调。
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,onlyKey.c_str(),pElement);
if(NULL==pElement){
CCLOG("Message warn:no seletor");
return;
}
CCObject *myTarget=pElement->target;
SEL_MsgCallFuncO mySeletor=pElement->selector;
if(myTarget&& mySeletor){
(myTarget->*mySeletor)(msg);
}
HASH_DEL(m_messagePush,pElement);
pElement->target->release();
CC_SAFE_DELETE(pElement);
}
msg就是我们需要回调传的数据了,楼主这里传的是消息数据类,然后就等着处理回调函数吧。
有点需要注意,楼主没去做具体测试,但问题应该是存在的,注册回调后target会被retain()一次,所以如果注册了回调而没有触发应该会造成内存溢出。所以不用等回调直接退出时,需要在target的onExit()方法中去删除注册!