2017-03-14 52 views
0

我試圖使用lambda來創建一個MenuItemImage趕上觸摸回調創建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; 

    }); 

但是,當我定義操作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; 
      }); 

任何想法是什麼原因導致這個錯誤?非常感激你的幫助。

回答

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; 
      }); 

此外,ScaleByRef類下降,所以這是一個自動釋放類。因爲您不立即使用scale它將從內存中釋放(0參考計數),並且在點擊mYouTube按鈕後將導致崩潰。

這就是爲什麼你必須撥打retain()。但是,當你不再需要它時(例如離開場景),你必須記得致電release()。在我看來,最好是在lambda函數內創建這個縮放動畫。你也可以寫一個簡單的函數,它會創建並返回scale

+0

非常感謝您的回覆,我的代碼有效,我明白現在的工作方式:) –