티스토리 뷰
힙에 저장되는 참조 타입은 메모리에서 해제되는지가 중요함 -> 이를 관리하는 ARC
(클래스의 인스턴스에만 적용됨)
가비지컬렉션과의 차이
ARC는 컴파일 시 참조 카운팅함
장점 : 메모리 관리를 위한 시스템 자원을 추가할 필요가 없음
단점 : 규칙을 모르면 영원히 해제되지 않을 수 있음
강한 참조를 하면 참조 횟수(Reference Count)가 1 증가
nil을 할당하면 카운트가 1 감소
참조 횟수가 0이면 메모리에서 해제
강한 참조 순환(Strong Refence Cycle)문제
인스턴스끼리 서로 강한 참조할 때 참조 횟수가 0이 되지 않아 메모리에서 해제되지 않음
약한 참조 Weak Reference
weak 키워드를 써주면 그 프로퍼티나 변수는 참조 횟수를 증가시키지 않음
약한 참조는 nil이 될 수 있어야 하기 때문에 항상 옵셔널 (=상수가 될 수 없음)
미소유 참조 Unowned Reference
참조하는 인스턴스가 항상 메모리에 존재할 것이라는 전제를 기반
참조하는 인스턴스가 메모리에서 해제되더라도 nil을 할당해주지 않는다 -> 옵셔널이나 변수가 아니어도 된다.
미소유참조를 하면서 메모리에서 해제된 인스턴스에 접근하려 한다면 런타임 오류발생
꼭 존재해야하는 이유가 있을 때는 미소유 참조를 사용한다.
(예를 들어, 신용카드에는 명의자가 꼭 있어야한다.)
미소유참조와 암시적 추출 옵셔널 프로퍼티
값이 꼭 있어야 하면서 한번 초기화되면 nil을 할당할 수 없는 조건
var ceo: CEO! 인 경우 unowned 사용 (암시적 추출 옵셔널)
클로저의 강한참조 순환
클로저가 인스턴스의 프로퍼티일 때나, 클로저의 값 획득 특성
즉, 클로저 내부에서 인스턴스의 프로퍼티나 메서드를 호출할 때 self.를 획득하므로 강한참조 순환 발생
획득목록(capture list)
참조 방식과 참조할 대상을 []로 묶고 뒤에 in 키워드를 써줌
var a = 0
var b = 0
let closure = { [a] in
print(a,b)
b = 30
}
a = 10
b = 20
closure() // 0 20
print(a) // 10
print(b) // 30
a는 [] 를 통해서 값을 획득, b는 획득 x
a는 클로저가 생성되면서 상수로 초기화되어 a가 변경되어도 클로저 내부에서 변경 안됨
b는 그렇지 않아서 계속 바뀌게 됨
참조타입에서는 다름!!
class SimpleClass {
var value: Int = 0
}
var x = SimpleClass()
var y = SimpleClass()
let closure = { [x] in
print(x.value, y.value)
x.value = 30
}
x.value = 10
y.value = 20
closure() // 10 20
print(x.value) // 30
print(y.value) // 20
참조 타입의 인스턴스라 결과는 같음(x.value가 클로저 안에서 10임)
[weak x, unowned y]로 사용할 경우
weak는 옵셔널이 되기 때문에 (x?.value, y.value)가 됨
참고도서
m.yes24.com/Goods/Detail/78907450
'iOS' 카테고리의 다른 글
[Swift] NSCache란? (image cache하기) (0) | 2021.07.21 |
---|---|
[iOS] MVVM이란? (0) | 2021.05.26 |
[iOS] 프로세스와 스레드 (0) | 2021.05.05 |
[iOS] NotificationCenter로 키보드 처리하기 (0) | 2021.04.09 |
[iOS] FoundationKit에는 무엇이 있을까? (0) | 2021.04.09 |