ARC: Auto Reference Count, swift가 메모리 누수를 방지하는 방식이다. 강한 참조가 생기면 count가 1증가하고 nil이 되는 순간 1이 감소한다.
그런데 두가지 이상이 서로가 서로를 강한 참조한다면. 서로에 대한 참조가 해제되지 않아 메모리에 계속 유지되는 leak현상이 일어난다.
만약 한가지 클래스에 여러 인스턴스들을 생성하고 그 인스턴스에 두가지 이상 변수를 할당한다면 그 모든 참조가 해제될때까지 메모리에서 사라지지 않는다.
결국 ARC는 인스턴스에 대한 참조 개수 트래킹하고 그 인스턴스가 모두 없어지면 그때서야 0이되고 해제
문제가 생기는 경우는 바로 두 클래스가
class House{
let name: String = ""
var room : Room?
}
class Room {
let num : Int = 0
var house : House?
}
var myhouse : House? = House(name: "내집")
var youroom: Room? = Room(num : 10)
myhouse?.room = youroom
youroom?.house = myhouse
이렇게 서로를 참조하는 경우 각각 ARC=2로 myhouse = nill을 하거나 youroom = nill을 해서 지워져도 하나가 여전히 남아있다.
이런 문제점들을 해결하기 위해 존재하는 것이 바로 약한참조와 unowned이다.
1. weak
강한 참조와 달리 arc증가 X.
인스턴스가 해제될때 해당 인스턴스를 참조하는 약한참조프로퍼티를 nill 초기화. = > 옵셔녈변수에만 사용가능. 상수에선 쓰일수 X
2. unowned
인스턴스간 강한참조는 여전히 없다.
다른 인스턴스의 수명이 동일하거나 길 때 사용
weak과 달리 옵셔널이 아닌 상수. 항상 값이 잇어야하기에!! 전제!! 메모리에 해제 되지않는게 instance를 참조한다고 확신이 들때 사용
유효하지 않은 인스턴스를 확인하더라도 프로그램이 종료되지 않는다.
그러니까 정리해보자면 값이 있음을 근거로 할경우는 unowned, 아니면 weak
'SWIFTUI' 카테고리의 다른 글
ConfirmationDialog (0) | 2023.09.15 |
---|---|
life cycle - swiftui (0) | 2023.07.03 |
MVVM,MVC pattern 좋나요 - swiftui (0) | 2023.05.04 |
Spritekit with swiftui(1) (0) | 2023.05.01 |
CoreMotion - Swift (0) | 2023.04.29 |