티스토리 뷰

반응형

?

View의 생명주기는 저번 글로 끝난 것 아닌가요;

맞습니다. 이 글은 순전한 저의 궁금증으로 작성된것이지만...!!!!!

iOS를 하신다면 꼭 알아야할 것들입니다.(ㅎ뭔들..)


일단 궁금증이 생긴건...바로...어제입니다..



이전글을 통해서 첫번째 뷰에서는 viewDidLoad가 불리지 않는 다는 사실을 배웠죠?

그리고 뷰의 생명주기는 각각의 뷰에서 가진다는 것도 아실테구요.

근데 왜!!! 두번째 뷰의 viewDidLoad는 두번째 뷰로 갈 때 마다 불리냐 ㅡㅡ

사실 한 1분정도 생각하다가..부스트캠프때 배운게 있어서 그거 때문이려나 생각했는데 그거 때문 맞습니다.


자, 이제 그게 뭔지 알려드릴게요.


일단, 저희는 back버튼이 있었죠?

즉, 네비게이션 컨트롤러를 썼다는 것은 아실거에요.


자, 아이폰을 사용하신다면 

이 네비게이션 컨트롤러가 아주아주 익숙하실거에요.

왜냐? 

어디서든지 이 네비게이션 컨트롤러가 쓰이고 있거든요!!

예를 들어 설정앱만 봐도...







설정 > 일반 > 소프트웨어 업데이트

를 가본다고 생각해볼게요.


그리고 소프트웨어 업데이트 스크린에서는

< 일반 버튼이 왼쪽위에 보시이죠?

그리고 일반에서는 < 설정 버튼이 보입니다.


그래서 제가 지금 도대체 뭘 말하고 싶냐구요?

 

뭔가 화면이 차곡차곡 쌓이는 것 같지 않나요?

뒤로가면 가장 최근에 봤던 화면이 뜨고..

자료구조가 생각나지 않으세요?




네, 바로 스택(stack)입니다.

스택이 뭔지는 다들 아시죠?

LIFO(Last-in First-out)구조입니다.


맞아요. 저희가 사용하는 네비게이션 컨트롤러도

이 스택구조와 100%같다고 보시면 됩니다.


네비게이션 컨트롤러는 반드시!! root View controller를 갖는 것.

아시죠?

우리 예제에서는 첫번째 뷰가 root view입니다.

확인하는 방법은 


네비게이션 컨트롤러를 우클릭하면 볼 수 있어요!


자, 이렇게 root view controller가 있고

그 위로 view들이 스택처럼 쌓이는(push) 구조입니다. 

push연산이 있으면 당연히!!pop연산도 있겠죠?

pop연산은 언제 수행될까요?

네!!제가 뒤로가기 버튼을 누르면 현재 화면은 사라지고(pop)

이 화면 바로 밑에 있는 화면이 이 스택의 top이 되면서 

현재 저희에게 top의 화면을 보여주겠죠?


이거랑 두번째뷰로 갈때마다 viewDidLoad()가 수행되는거랑

무슨상관이에요 도대체;;;

라고 하실 수 있을거에요.

하지만 상관있습니다!!


스택에서 pop된 데이터는 어떻게 되는지 아시나요?

네. 메모리에서 사라지게 됩니다.

이젠 필요없는거거든요. 

왜?


pop했으니까!!!


우리 예제에서 생각 해볼까요?

앱을 실행하면,

첫번째 화면이 나오게 됩니다. 



이제 스택에 이 뷰가 push되겠죠? 또한 이 뷰는 스택의 top이 되게 됩니다.


그리고 저 버튼을 클릭하면


이렇게 두번째 뷰가 나오게 됩니다.

이 두번째 뷰는 스택에 push되었고, top역시 이제 이 두번째 뷰가 되겠네요.


이제 첫번째 뷰로 가볼까요?

자, 이제 스택의 상태는 어떻게될까요?

top에 있던 두번째 뷰는 pop되고 

다시 첫번째 뷰가 이 스택의 top이 되었습니다.





다시 첫번째 뷰로 갔는데 왜

1st viewDidLoad가 콘솔창에 안나온지 아시겠나요?


viewDidLoad가 언제 호출된다고 했죠?


"Called after the controller'€™s view is loaded into memory"

: 뷰의 컨트롤러가 메모리에 로드되고 난 후에 호출됩니다.


자, 현재 스택에는 첫번째 뷰가 있는 상태죠?

이 첫번째 뷰는 앱이 실행될 때 메모리에 로드되었으므로

다시 viewDidLoad()가 호출되지 않는 것입니다.


그러나 두번째 뷰는 어떨까요?

현재 두번째뷰는 스택에서 pop된 상태이므로

다시 두번째뷰를 가려면 메모리에 올려서 스택에 push해주어야 겠죠?

그래서!!!



이렇게 두번째 뷰의 viewDidLoad()만 호출되게 된답니다 :)


이제 왜 2nd viewDidLoad만 호출되는지 아시겠나요?

ㅎㅎㅎ


오늘의 핵심은


1. 네비게이션 컨트롤러의 동작은 자료구조에서의 '스택'과 같다!

2. pop을 하면 스택에서 빠져나간 뷰 컨트롤러는 메모리에서 사라진다!


가 되겠네요!


도움이 되었으면 좋겠어요!🙏













반응형