CCNotificationCenter.h
/** @brief Adds an observer for the specified target.
* @param target The target which wants to observe notification events.
* @param selector The callback function which will be invoked when the specified notification event was posted.
* @param name The name of this notification.
* @param obj The extra parameter which will be passed to the callback function.
*/
void addObserver(CCObject *target,
SEL_CallFuncO selector,
const char *name,
CCObject *obj);
/** @brief Posts one notification event by name.
* @param name The name of this notification.
* @param object The extra parameter.
*/
void postNotification(const char *name, CCObject *object);
addObserver方法和postNotification方法都能附加一个object对象,当两个都传递object不是同一个对象且都不为空的时候回调方法获得CCObject对象是哪个对象呢?
答案是回调方法不会执行!
CCNotificationCenter.cpp
//
// observer functions
//
void CCNotificationCenter::addObserver(CCObject *target,
SEL_CallFuncO selector,
const char *name,
CCObject *obj)
{
if (this->observerExisted(target, name))
return;
CCNotificationObserver *observer = new CCNotificationObserver(target, selector, name, obj);
if (!observer)
return;
observer->autorelease();
m_observers->addObject(observer);
}
void CCNotificationCenter::postNotification(const char *name, CCObject *object)
{
CCArray* ObserversCopy = CCArray::createWithCapacity(m_observers->count());
ObserversCopy->addObjectsFromArray(m_observers);
CCObject* obj = NULL;
CCARRAY_FOREACH(ObserversCopy, obj)
{
CCNotificationObserver* observer = (CCNotificationObserver*) obj;
if (!observer)
continue;
if (!strcmp(name,observer->getName()) && (observer->getObject() == object || observer->getObject() == NULL || object == NULL))
{
//默认是0
if (0 != observer->getHandler())
{
CCScriptEngineProtocol* engine = CCScriptEngineManager::sharedManager()->getScriptEngine();
engine->executeNotificationEvent(this, name);
}
else
{
//如果传递的不是同一个对象且都不为空的时候执行不到这个方法
observer->performSelector(object);
}
}
}
}
CCNotificationObserver.cpp
CCNotificationObserver::CCNotificationObserver(CCObject *target,
SEL_CallFuncO selector,
const char *name,
CCObject *obj)
{
m_target = target;
m_selector = selector;
m_object = obj;
m_name = new char[strlen(name)+1];
memset(m_name,0,strlen(name)+1);
string orig (name);
orig.copy(m_name,strlen(name),0);
//不注册的时候初始为0
m_nHandler = 0;
}
void CCNotificationObserver::performSelector(CCObject *obj)
{
if (m_target)
{
if (obj) {
(m_target->*m_selector)(obj);
} else {
(m_target->*m_selector)(m_object);
}
}
}