티스토리 뷰

iOS

[iOS] ARC, weak와 unowned

Kim_Baechu 2021. 5. 5. 16:03

힙에 저장되는 참조 타입은 메모리에서 해제되는지가 중요함 -> 이를 관리하는 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

 

스위프트 프로그래밍

문법을 넘어 프로그래밍 패러다임도 익히는 스위프트 5스위프트 5의 핵심 키워드는 ‘안정화’다. ABI 안정화 덕분에 버전과 환경에 크게 영향받지 않고 더 유연하게 스위프트를

m.yes24.com

 

'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
댓글
공지사항