Deinitializtion

작성일

Deinitializtion(메모리 해제)

간단한예제는

var a: Int? = 10
a = nil

출력하면

10
nil

이다. 사용을 안할때 nul로 적어주면 된다.
다른큰 예제를 보자.

class Game {
  var score = 0
  var name = ""
  var round: Round?

  init(){
    print("game init")
  }
  deinit{
    print("gaem deinit")
  }

}

class Round {
  var gameInfo = Game?
  var lastRound = 10
  var roundTime = 20
}

var game: Game? = Game()
game = nil

출력하면

game init
game deinit

게임 init이 먼저 나오고, game = nil하고 난후에 deinit이 나오는걸 볼 수 있다. 이렇게 메모리에서 내렸을때 deinit메서드가 활성화 된다.

class Game {
  var score = 0
  var name = ""
  var round: Round?

  init(){
    print("game init")
  }
  deinit{
    print("gaem deinit")
  }

}

class Round {
  var gameInfo = Game?
  var lastRound = 10
  var roundTime = 20
}

var game: Game? = Game()
var round: Round? = Round()

round?.gameInfo = game
game?.round = round

game = nil

출력하면

game init

nil을 해도 deinit이 안된다.즉 이런 방식으로 서로 참조를 하면 메모리 누수가 일어난다.

강제하는 방법

class Game {
  var score = 0
  var name = ""
  var round: Round?

  init(){
    print("game init")
  }
  deinit{
    print("gaem deinit")
  }

}

class Round {
  weak var gameInfo = Game?
  var lastRound = 10
  var roundTime = 20
  deinit {
    print("round deinit")
  }
}

var game: Game? = Game()
var round: Round? = Round()

round?.gameInfo = game
game?.round = round

game = nil
round = nil

Game은 Round가 없어도 되지만,
Round는 Game이 없으면 존재자체가 없다.
따라서 위코드 처럼 Round 앞에 weak를 붙여주면, Game이 없으면 자기도 같이 없애겠다는 의미이다.
출력하면

game init
game deinit
round deinit

이렇게 deinit이 된다.