cocos2d-x中NotificationCenter回调函数被第二次调用(第二次生成相同场景订阅同一消息)时,变量、指针的值都变为了0x00000000或0xdddddddd的原因

本人使用了一个场景,并且对该场景进行重复的切换(push,pop),且在这个场景的初始化函数中订阅了某个消息

// 订阅消息
	NotificationCenter::getInstance()->addObserver(
		this, callfuncO_selector(MutiplayerReadyScene::roomDataCallback), Command::getStrOfInt(Command::RoomData), NULL);

当收到订阅消息后会触发对应的回调函数,第一次进入场景回调函数正常反应,但当我pop了该场景,重新create(),push()该场景后,该回调函数中的变量竟然变成了0x00000000或0xdddddddd之类的奇怪值,导致程序中断,很是奇怪

后来发现,第二次进入回调函数时的this指针竟然指向的是第一个场景对象!!!(这个对象应该已被释放),看来NotificationCenter类并不会因为你释放了一个对象而自动取消该对象对消息的订阅,且我们可以发现

NotificationCenter::getInstance()->addObserver(
		this, callfuncO_selector(MutiplayerReadyScene::roomDataCallback), Command::getStrOfInt(Command::RoomData), NULL);

中this参数的作用了,想必是消息中心会根据这个参数(this)指向的地址,确定接收到该被订阅的消息时调用回调函数的主体。


那么解决方法自然是在pop()该场景之前取消该对象订阅的所有消息

	// 移除被订阅的消息
	NotificationCenter::getInstance()->removeAllObservers(this);

展开阅读全文

没有更多推荐了,返回首页