궁금증 : unowned self, weak self 안 붙이면...?


동적으로 메모리를 할당할 때 (객체) 힙영역에 생성되고 필요 없을 경우 소거됩니다.
언어별 메모리 관리 방식
JAVA
자바는 가비지컬렉터를 이용해서 자동적으로 이 메모리를 관리하게 됩니다.
편리하지만 수시로 돌아가다보니 퍼포먼스에 영향을 줄 수 있습니다.
C, C++
직접 메모리 할당, 해제해주어야 함
Swift
ARC (자동 참조 관리)
자동참조계수를 통해 추적하고 메모리 관리.
필요없는 인스턴스 메모리를 자동적으로 해제. (Count가 0이 되면 해제됨.)
자동참조 계수에 대한 예제
view변수에 MyView 인스턴스를 초기화 하였습니다.
이때 view는 Strong reference, 강한 참조를 가지며 MyView 인스턴스의 reference count는 1입니다.
변수 선언시 강한참조가 디폴트입니다.
class Example {
var exampleView: UIView
}
var view = MyView()
Example 인스턴스가 example 변수에 초기화되었습니다.
위에서 생성한 MyView인스턴스인 view를 exampleView 에 할당하였습니다.
따라서 MyView 인스턴스의 reference Count는 1이 증가하여 2가 됩니다.
var example = Example(exampleView: view)
문제점 발생 : Retain Cycle
여러 개의 인스턴스가 서로에 대한 강한참조를 가질 때 retain Cycle이 발생합니다.
인스턴스가 사용되지 않지만 Count를 0이 되지않아 메모리 누수가 발생하는 것이죠.
Retain Cycle 예제
class API {
// Strong reference to completion, a block
var completion: ((Data?, Error?) -> Void) = { (_,_) in }
}
class HomeVC: UIViewController {
let api = API()
func hideLoadingIndicator() {}
}
아래 코드에서 loadAPI()호출은
1. Self(HomeVC)는 api를 강하게 참조하며
2. api는 completion에 대한 강한 참조를 가지고 있다
3. completion는 Self(HomeVC)에 대한 강한 참조를 가지고 있습니다
따라서 Retain Cycle이 발생합니다.
extension HomeVC {
func loadAPI() {
api.completion = { (data, error) in
self.hideLoadingIndicator()
}
}
}
Retain Cycle 해결 방법
1. weak 참조
HomeVC는 api의 강한참조를 가지고 api는 completion의 강한참조를 가집니다.
하지만 completion는 self (HomeVC)에 대한 약한 참조를 가지게 되므로 retain Cycle이 발생하지 않게 됩니다.
주의) 참조하던 인스턴스 할당이 해제되면 nil이 되어야하므로 반드시 Optional로 선언되어야 함.
extension HomeVC {
func loadAPI() {
api.completion = { [weak self] (data, error) in
self?.hideLoadingIndicator()
}
}
}
2. unowned 참조
unowned 참조도 마찬가지로 ARC count를 증가 감소 시키지 않습니다.
completion는 self (HomeVC)에 대한 unowned 참조를 가지게 되므로 retain Cycle이 발생하지 않게 됩니다.
주의) 참조하던 인스턴스의 값이 항상 존재한다고 간주, nil이 될 수 없음.
extension HomeVC {
func loadAPI() {
api.completion = { [unowned self] (data, error) in
self.hideLoadingIndicator()
}
}
}
'IOS' 카테고리의 다른 글
[Error] Compiling for iOS 8.0, but module 'RxTest' has a minimum deployment target of iOS 9.0 (0) | 2023.03.07 |
---|---|
[iOS] Swinject를 적용해보면서... - 의존성 주입 Dependency Injection, Inversion (1) | 2023.01.15 |
[iOS] CoreData로 꼼꼬미 단어장 앱 만들기 (0) | 2022.12.23 |
[iOS] Rx 다시 정복(1) feat. Rx Study발표 - 에이젠 (0) | 2022.12.19 |
[iOS] arch x86_64 왜 쓰세요? CocoaPod 쓰다가 생긴 궁금증 - 에이젠 (0) | 2022.12.04 |
댓글