2015-04-23 30 views
2

我完成了spritekit遊戲,但沒有強大的參考週期知識。我沒有任何崩潰或明顯的問題,但使用工具我可以看到我的對象被保留在每個級別之間(SKScene應該在各級之間進行處理)。Swift/SpriteKit - 無法打破強大的參考週期

這裏是我的一般遊戲的部分:

GameConfig靜態結構

我有一個全局可訪問的靜態結構,引用我的視圖控制器。我從整個應用程序使用這個結構訪問viewController。我給你GameConfig.viewController = self了的viewController的viewDidLoad

GameViewController

在這裏我引用我的SKScene,並SKView這樣

var skView: MyView! 
weak var scene: SKScene! 

BaseScene

這是我的基地SKScene類的內。這是獲取類本身

let indicators: Indicators = Indicators() 

KillSceneBaseScene

在我BaseScene子類的子類的引用這個類的唯一屬性,我已經包含在陣列中許多自定義子類。這些自定義子類可以引用場景,但場景並不直接引用它們。它只能引用它們的容器數組。例如:

var radarBlips: [RadarBlip] = [] 

我有具有與KillScene

var ship: KillShip = KillShip() 

在我的兩個IndicatorsKillShip類很強的參考週期的一個特性,我已經使用weak關鍵字引用我的場景。

事實上,我已經找到了我參考場景的每個實例,並且在其前面放置了weak

我試圖做一個精簡的遊戲,並在精靈和場景之間創建一個強大的引用循環,然後打破它。我成功地這樣做了。但我似乎無法調試我自己的遊戲。

任何詳細的建議將是有幫助的。我知道在周圍傳球時會有一些技巧。也許這跟它有關係?任何我能找到的建議都會很棒。我已將weak放在比我需要的地方更多的地方。

我不能讓現場deinit

+0

當我使用精靈套件進行強大的參考週期時,要麼是因爲我忘記將「weak」添加到保存對其父節點的引用的節點。或者,我通過在閉包中不使用'[無主自我]'或'[弱自我]'來創建一個強大的參考週期。 – ABakerSmith

+0

你可以擴大關閉。我沒有真正考慮過這一點。也許鏈接我一個很好的參考? – hamobi

+0

看看這個:http://blog.xebia.com/2014/10/09/function-references-in-swift-and-retain-cycles/然後,我建議通過您創建的任何關閉並確保你沒有創建任何強大的參考週期。 – ABakerSmith

回答

0

有沒有一種簡單的方法來做到這一點。檢查所有引用彼此的屬性,並使用弱或無主。 spritekit中更大的問題是檢查閉包。當你運行延遲關閉(在SKActions)和類似的事情時,在關閉中使用[weak self]是非常重要的,所以它不會讓對象保持活動狀態。在強壯的參考週期被破壞之前,添加更多的弱點和不需要的非常容易,然後用後退的方式刪除不必要的參數。