メインメニューにゲームシーンが表示され、プレイヤーが負けたときにゲームシーンがメニューを表示します。メニューからゲームシーンに移行するときには、メニュー、が正常に呼び出されます。私の問題は、逆のことは起こらないということです(ゲームシーンからメニューシーンに移行するとき、、は呼び出されません)。シーン間で遷移するときの保持サイクルのトラブル
私が作成した新しいメインメニューインスタンスとインスタンスを作成するゲームシーンの間に強い参照サイクルがあると思われます。シーンを提示しようとしているときに、実行時に事実、私は以下のように私gameSceneのコードを編集した場合、私はdeinitの呼び出しを得るかが、私のアプリのクラッシュの問題:実行時に
class GameScene: SKScene {
// Some stuff
// Now the function which is called when I want to present back the menu scene:
func lose() {
// Some stuff
// Delay is a helper function
delay(bySeconds: 2.0, closure: { [unowned self] in
for child in self.children {
child.removeFromParent()
}
unowned let menu = MainMenu(size: CGSize(width: 1152, height: 2048))
let reveal = SKTransition.fade(with: SKColor.black, duration: 1.0)
self.view?.presentScene(menu, transition: reveal)
})
}
}
私は次の取得エラー:
Attempted to retain deallocated object
ここで遅延の定義です:
public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping() -> Void) {
let dispatchTime = DispatchTime.now() + seconds
dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
}
public enum DispatchLevel {
case main, userInteractive, userInitiated, utility, background
var dispatchQueue: DispatchQueue {
switch self {
case .main: return DispatchQueue.main
case .userInteractive: return DispatchQueue.global(qos: .userInteractive)
case .userInitiated: return DispatchQueue.global(qos: .userInitiated)
case .utility: return DispatchQueue.global(qos: .utility)
case .background: return DispatchQueue.global(qos: .background)
}
}
}
そして、ここに私のMainMenuクラスがあります:
class MainMenu: SKScene {
let gameScene = GameScene(size: CGSize(width: 1152, height: 2048))
let reveal = SKTransition.fade(with: SKColor.black, duration: 1.0)
// Some stuff
// override func didMove(to ...
// Now the function which is called when I want to present the game scene:
func presentGame() {
view?.presentScene(gameScene, transition: reveal)
}
}
私はさまざまなことを試みましたが、うまくいかなかった(例:gameSceneのinitメソッドで新しいメニューインスタンスを設定するなど)。
私はGameSceneクラスの定数メニューの「所有されていない」定義を削除する場合は、移行が正常に行われているが、deinitは呼び出されません。
提案がありますか?
があなたの代わりに「未所有の自己」の「弱い自分」を試してみましたか? – Emptyless
はい、動作しません。 – gionti