2017-02-03 2 views
1

메인 메뉴에 게임 장면이 표시되는 게임이 있고 플레이어가 패배하면 게임 장면이 다시 표시됩니다. 메뉴에서 게임 장면으로 전환 할 때 메뉴 , 즉이 성공적으로 호출됩니다. 내 문제는 그 반대가 발생하지 않는다는 것입니다 (게임 장면에서 메뉴 장면으로 전환 할 때 ,이 호출되지 않음).장면 사이를 전환 할 때 유지 사이클 문제가 발생했습니다.

내가 만든 새 주 메뉴 인스턴스와 인스턴스를 만드는 게임 장면 사이에 직접 강력한 참조주기가 있다고 의심됩니다. 나는 다음과 같은 얻을 런타임시

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

    } 
} 

: 나는 다음과 같은 내 gameScene의 코드를 편집하는 경우 사실의 문제, 나는 deinit의 전화를받을 수 있나요하지만, 런타임시 내 응용 프로그램 충돌 장면을 제공하는 동안 오류 : 여기

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가 호출되지 않습니다.

제안 사항?

+0

는 대신 '소유되지 않은 자기'의 '약한 자기를'시도? – Emptyless

+0

예. 그렇지만 작동하지 않습니다. – gionti

답변

0

마지막으로 내 게임 장면을 자체적으로 초기화 해제하지 못하는 것을 발견했습니다.

내 질문에 제공 한 코드와 아무런 관련이 없습니다. 문제는 가속도계의 입력을 해석 할 책임이있는 폐쇄 장치 내부의 강력한 "자체"참조에있었습니다.

더 많은 정보에 관심이 있다면 여기를 참조 : Retain cycle suspected in closure

관련 문제