iyOmSd/Title: iOS Think🤔

[iOS] UIAlertController 참조과정

냄수 2020. 9. 3. 18:49
반응형

순환참조가 일어날것 같은 상황에 대해서 알아볼건데요!

 

alert의 handler를 추가할 때 보면...

alert의 action은 클로저인데 이 상황에서 self를 참조하면

개념상 순환참조가 일어날거 같잖아요?

 

우선 결론부터 말씀드리면 순환참조는 일어나지않아요!!

아무리 alert를 켯다껏다해도 메모리가 쌓여서 앱이 죽은 적이 없잖아요??

 

 

한 번 생각해 볼까요!!

let alert = UIAlertController(...)
let action = UIAlertAction(...) { 
	self.view = ...
}
alert.addAction(action)
present(alert, animated: false, completion: nil)

VC에서 alert를 생성해주고,

action도 구현해서 alert에 달아주고,

present를 하는 방식으로 구현하겟죠??

 

위의 코드를 기반으로보면

이런 모습이 되겠죠??

 

VC에서 present를 이용해서 alert를 참조하게되고

alert는 addAction을 통해서 action을 참조하게되고

action은 self.view를 통해서 다시 VC를 참조하게되죠..

순환참조네요..?!?!

이렇게 된다면 당연히 문제가 있겠죠??

 

 

let alert = UIAlertController(...)
let action = UIAlertAction(...) { [weak self]
	self?.view = ...
}
alert.addAction(action)
present(alert, animated: false, completion: nil)

[weak self] self캡처링을 통해서  순환참조를 막기위해 weak로 사용하도록 변경해봤어요

물론 이 부분에서는 이순간에는 순환참조가 일어나지않지만

 

캡처링을 한코드와 안 한코드 모두 같게 동작해요

순환참조가 일어나지 않아요

 

왜일까요..?!

 

이유는 크게 복잡하지 않아요

Alert를 띄우고 버튼을 누르면 Alert가 사라지잖아요

Action을 추가하면 버튼이 생기고

그 버튼이 dismiss()를 호출하면서 VC가 참조하던 Alert가 사라지기때문에 순환참조가 사라질것 같다고 생각해요

 

이런 과정이 있기때문에 클로저를 이용하는데 캡처링을 따로 안해줘도 순환참조가 일어나지 않는것 같아요 :)

 

 

 

혹시 다른 의견이거나 잘 알고 계시는 분들 댓글에 피드백 부탁드려요...!!

반응형