我的Cocos2d-X应用程序中有以下代码
void SampleRequest::setResponseCallback(CCCallFuncND* cb){
if(cb){
cb->retain();
stored_cb=cb;
}
}
void SampleRequest::executeStoredCallback(){
if(stored_cb)
stored_cb->execute();
}
void SampleRequest::releaseCallback(){
if(stored_cb){
stored_cb->release();
stored_cb=NULL;
}
}
和一个简单的课程
void RequestHandler::handleSampleRequest(int data){
CCLog("--------------------------------------------> Its here for me to do %d",data);
}
和另一个代码的和平
int i=10;
SampleRequest *t=new SampleRequest();
t->setResponseCallback(
CCCallFuncND::create(
this,
callfuncND_selector(RequestHandler::handleSampleRequest),
(void*)&i));
但是我收到的值是0.如何将I的值发送回回调函数,以及如何向该函数发送多个参数。
亲切的问候,
答案 0 :(得分:1)
int i=10;
您是在堆栈上声明我是临时变量,而不是在堆上,还是作为请求对象实例数据? 如果是这样,当你创建它的块退出时(变量范围结束),你的i变量将被销毁。
这可以解释为什么回调会收到一个指向未定义内存的值,该值在调用时已被破坏。
尝试使用new运算符,或将i值存储在请求对象中,直到进行cb调用。
如何向此功能发送多个参数
你不会;只需将指针传递给结构或对象即可。如果您的所有存储数据都在“请求”实例中,您也可以传递实例本身。
例如,再次假设传递给回调的数据在调用回调函数时将保留在内存中(即下面的“RequestData”实例):
struct RequestData
{
int value1 ;
int value2 ;
// ....
} ;
class RequestHandler: public cocos2d::CCObject
{
// ...
public:
void requestCallback( CCNode* sender, void* pData ) ;
}
在您的实施中:
RequestHandler::requestCallback( CCNode* sender, void* pData )
{
RequestData* pRequestData = static_cast<RequestData*>( pData ) ;
if ( pRequestData )
{
// do something ...
}
}
要构建您的调用,构建一个RequestData实例,其中包含您需要传递给回调的所有数据,请确保它在堆上分配“new”或另一个对象的一部分(例如,在队列中)这样在调用回调时它的数据在内存中仍然有效。我在这一点上坚持一点,因为你需要某种数据存储机制作为你设计的一部分,否则你的回调可能会发现自己在内存中处理无效地址(悬空指针)。
基本上,来自您之前的代码:
RequestData* pRequestData = new RequestData();
// fill in the structure data here...
SampleRequest *t=new SampleRequest();
t->setResponseCallback(
CCCallFuncND::create(
this,
callfuncND_selector(RequestHandler::requestCallback),
(void*)pRequestData));
答案 1 :(得分:0)
//像这样使用
void* data = (int*) 10;
int value = *((int*) &data);