참조를 갖고 있지 않을때 UINavigationViewController에서의 PUSH, POP
우선 단순히 UINavigationViewController를 통해 ThirdVC를 push, pop 할 때마다 ThirdVC가 생성 해제 되는 것을 볼 수 있습니다.
메모리를 확인해도 정상적으로 생성되고 없어지는 것을 확인할 수 있습니다.
ARC 짱짱!
강한 참조로 연결되어 있을때 PUSH, POP
아래 코드와 같이 FirstViewController의 프로퍼티로 ThirdViewController의 메서드를 가지고 있을 때는 ThirdViewController가 해제될까?
class FirstViewController: UIViewController {
var handler: (() -> Void)?
@objc private func moveToThirdVC() {
let thirdVC = ThirdViewController()
// 강한 참조
closure = thirdVC.doSomething
self.navigationController?.pushViewController(thirdVC, animated: true)
}
}
class ThirdViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("ThirdVC 생성 :\(Unmanaged.passUnretained(self))")
}
func doSomething() { }
deinit {
print("ThirdVC 해제 :\(Unmanaged.passUnretained(self))")
}
}
ThirdViewController로 이동하면서 ThirdViewController의 doSomething 메서드를 FirstViewController의 handler로 넣어줬다.
실행해 줬더니 재밌는 결과가 나왔다.
ThirdViewController가 pop 될 때 메모리에서 바로 해제되지 않았다!
FirstViewController에서 ThirdViewController의 doSomething 메서드를 강한 참조로 갖고 있으니 해제되지 않으리라 짐작할 수 있다.
재밌었던 점은 로그의 메모리 주소를 확인해 보면 새로운 ThirdViewController가 생성될 때 기존 ThirdViewController가 해제된다는 점이다.
moveToThirdVC() 메서드가 동작해 ThirdViewController 이동할때 로직을 자세히 살펴보면
- 새로운 ThirdViewController를 생성해 주고
- 새로 생성한 ThirdViewController의 doSomething 메서드를 FirstViewController의 handler 프로퍼티에 새롭게 할당하면서
- 기존 ThirdViewController에 대한 참조가 없어짐과 동시에
- 기존 ThirdViewController가 release 되어 기존 ThirdViewController가 메모리에서 해제되는 것이다
이번 실험을 통해 ARC가 우리의 앱에 대한 메모리 관리를 아름답고 빈틈없이 관리하고 있다는 것을 알 수 있었다.
ARC가 없었던 Object-C의 MRC 시절에는 얼마나 힘들었을까..
ARC 짱짱!
'iOS > Swift' 카테고리의 다른 글
weak, [weak self]를 사용하여 순환참조를 해결하기 + 메모리 영역 확인 (0) | 2023.11.09 |
---|---|
[Swift] Subscript 알아보기 :: String에서는 subscript를 사용할 수 없는 이유 (0) | 2023.03.02 |
[Swift] AnyObject란? (런타임 시점에 결정된다) (0) | 2023.02.23 |
[Swift] String과 Substring을 메모리에서 효율적으로 관리하는 방법 (0) | 2023.02.18 |
[Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clusters (0) | 2023.02.18 |