2014-11-20 68 views
0

在sprite工具包中,我一直在努力研究爲什麼我的SKScene不會釋放,並且我相信我終於更接近答案了:我使用了很多SKAction s和completion塊。我剛剛得知我必須使用弱引用。用__弱點避免泄漏

我該如何正確地做到這一點? 一切塊內必須弱?比如,我最近剛剛更改了塊的一個看起來像這樣:

__weak typeof(self.heli) weakheli = self.heli; 

    [weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
      ghostMode = NO; 
    }]; 

難道我也不得不做出__weak typeof(ghoseMode) weakGhostMode = ghostMode聲明,只改變weakGhostMode塊裏面?

再舉一個例子,應該:

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [self fireMG]; 
    } 
}]; 

改爲:

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

感謝您的幫助!當我通過教程學習Sprite Kit時,我們從未警告過使用帶有強引用的completion塊。

+0

你怎麼知道你的'SKScene'沒有被釋放?你用儀器測試了你的遊戲嗎? – 0x141E 2014-11-20 19:38:10

+1

@ 0x141E對於其中一個,是的,我已經用儀器測試過了,每次我啓動一個新的遊戲場景時,內存都會上升,永遠不會回落。二,我有'NSLog'''我的'SKScene'的'dealloc'方法,它從來沒有被調用過。 – Todd 2014-11-20 19:44:43

+0

我沒有看到你提供的將保留'SKScene'的代碼。 – 0x141E 2014-11-20 21:23:36

回答

1

這不需要__weak,因爲heli對象是用來運行動作的,所以在裏面沒有引用這個塊。

__weak typeof(self.heli) weakheli = self.heli; 

[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
     ghostMode = NO; 
}]; 

因此,這將是罰款:

[self.heli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{ 
     ghostMode = NO; 
}]; 

也是一樣的:

[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

它應該是:

[self runAction:[SKAction waitForDuration:.1f] completion:^{ 
    if (mgFiring) { 
     [weakSelf fireMG]; 
    } 
}]; 

時才需要weakSelf(如果在所有的塊)裏面。

+0

爲什麼ghostMode不需要弱版本? – Todd 2014-11-20 22:02:02

+0

另外,我可以讓他們使用弱變量來調用動作嗎?我已經完成了並且改變了其中的130個。 – Todd 2014-11-20 22:02:55

+0

ghostmode是一個bool?它不會很弱,那不是一個對象。 – LearnCocos2D 2014-11-20 23:48:42