我尝试使用Lambda创建一个MenuItemImage来捕获触控回调: 这很好用:
MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
// lambda function handle onClick event
[=](cocos2d::Ref *pSender) -> bool {
auto scale = ScaleBy::create(0.5f, 1.1f);
mYouTube->runAction(scale);
return true;
});
但是当我在lambda 之外定义动作scale
时,它没有按预期工作,Visual Studio编译没有任何问题但是应用程序崩溃了菜单项点击:
auto scale = ScaleBy::create(0.5f, 1.1f);
MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
// lambda function handle onClick event
[&](cocos2d::Ref *pSender) -> bool {
mYouTube->runAction(scale);
return true;
});
知道导致此错误的原因吗?非常感谢您的帮助。
答案 0 :(得分:1)
因为scale
是局部变量,所以你必须将它传递给lambda函数,如下所示:
auto scale = ScaleBy::create(0.5f, 1.1f);
scale->retain();
MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
// lambda function handle onClick event
[&, scale](cocos2d::Ref *pSender) -> bool {
mYouTube->runAction(scale);
return true;
});
此外,ScaleBy
从Ref
类下降,因此它是自动释放类。由于您不会立即使用scale
,因此会从内存中释放(0引用计数),并在点击mYouTube
按钮后导致崩溃。
这就是你必须致电retain()
的原因。但是当你不再需要它时(例如离开场景),你必须记得调用release()
。在我看来,在lambda函数中创建这个缩放动画会更好。您还可以编写一个简单的函数,它将创建并返回scale
。