2014-11-20 114 views
0

我有一個MasterViewController遊戲。它有一個「Play」按鈕,可以連接到GameViewController。 GameViewController和GameScene是普通的遊戲版本,除了我在GameScene的更新方法中添加了一個NSLog,並且在故事板上創建了一個從GameViewController跳轉到MasterViewController的「退出」按鈕。如何殺死SKScene

一切按預期工作。我啓動應用程序並觸摸「播放」按鈕,它將轉換到GameViewController到GameScene。好吧,我看到標準的「Hello World」消息,並且可以觸摸來創建旋轉飛船。我開始從更新方法獲取NSLog輸出。大。

但是,當我單擊退出按鈕並且它退回到MasterViewController時,我仍然從GameScene更新方法獲取NSLog輸出,因此GameScene仍然處於活動狀態。我想GameScene消失了。 GameScene增加了一個dealloc,它從來沒有被調用,可能是因爲ARC。

在GameViewController我添加了一個弱gameScene屬性和:

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    NSLog(@"viewWillDisappear"); 
    [_gameScene removeAllChildren]; 
    [_gameScene removeAllActions]; 
    [_gameScene removeFromParent]; 
    _gameScene = nil; 
} 

仍然得到從GameScene更新方法輸出的NSLog的。嘆...我怎麼殺死GameScene死亡,死亡,死亡?

我做了幾次Play/Quit/Play/Quit轉換。從更新方法的輸出是:

2014-11-20 12:48:41.551 Demo[7386:2004098] update: 0x7b091090 
2014-11-20 12:48:42.095 Demo[7386:2004098] update: 0x7ed21020 
2014-11-20 12:48:42.656 Demo[7386:2004098] update: 0x7eb1c4b0 
2014-11-20 12:48:43.217 Demo[7386:2004098] update: 0x7b091090 
2014-11-20 12:48:43.762 Demo[7386:2004098] update: 0x7ed21020 
2014-11-20 12:48:44.322 Demo[7386:2004098] update: 0x7eb1c4b0 

我GameScenes的因此,所有仍然在後臺運行。

+0

您的segue&GameViewController創建工作如何?是否有一個塊捕獲GameViewController並掛在它上面? GameViewController以某種方式捕獲自己? – mc01 2014-11-20 19:02:35

+0

使用故事板我在MasterViewController上放置了一個Play按鈕,並在GameViewController上放置了一個Quit按鈕,並在每個按鈕與其他控制器之間拖拽控制器來設置segues。普通香草的東西。我創建了這個演示項目只是爲了探索這個,並沒有做任何特別的事情。 – Drew 2014-11-21 14:05:46

回答

0

您必須確保沒有其他對象強烈指向要從內存中移除的對象。見Apple Developer

+0

難道問題是我的視圖控制器之間的segasis是模態?我將它們改爲Show Segues,並沒有什麼區別。 – Drew 2014-11-21 14:31:20

0

我發現了一個解決方法 - 使用導航控制器,我總是隱藏起來爲我的遊戲騰出空間。要轉換到層次結構中的下一個視圖控制器,請使用「顯示」漸變。要彈回,添加自己的返回按鈕和連接動作:

- (IBAction)backButtonClicked:(UIButton *)sender { 
    [[self navigationController] popViewControllerAnimated:YES]; 
} 

我也有我的GameViewController一個地方,我用的是「暫停」按鈕,彈出回到根視圖控制器的所有道路。

- (IBAction)pauseButtonClicked:(UIButton *)sender { 
    NSArray * viewControllers = self.navigationController.viewControllers; 
    NSLog(@"nav view controllers: %@", viewControllers); 
    UIViewController * targetViewController = viewControllers[0]; 
    NSLog(@"target controller: %@", targetViewController); 
    [self.navigationController popToViewController:targetViewController animated:YES]; 
} 

所有這些都可以在GameViewController和GameScene消失時正確解除分配。