iOS개발하기 #43. iOS Application Life Cycle

오늘의 주제

  • iOS 애플리케이션의 생명주기
  • ViewController의 생명주기 

마흔 세번째 시간입니다.^^

요 며칠 제 개인적으로 좀 힘든일도 있고, 빡빡한 프로젝트 일정 때문에 제대로 포스팅을 하지 못했습니다.

흙흙 아직 프로젝트가 마무리 되지는 않았지만 최대한 짬을 내 보도록 하겠습니다..ㅎ

우리 이제까지 정말 쭉쭉 달려왔습니다.

이것저것 해 보면서 많은 것을 맛 봐왔죠...ㅎ
물론 이것 저것 많이 해 보는 것도, 맛을 보고 언제 어디서 어떻게 써야할지 감을 익히는 것도 중요합니다.

그러나 더더욱 중요한 것은 통괄적인 흐름이고 기초죠.

초반에 포스팅 할 때 말씀드렸듯이 아주 기초적인 사항들은 많이 스킵하고 넘어왔습니다.

이번에는 그래서 정말 기초 하나를 같이 알아보고자 합니다.

물론 초보자 님께서 포스팅을 해 달라고 부탁하신 내용이기도 합니다 🙂 고맙습니다 ㅎ

자, 그럼 이제 같이 해 볼까요?

스따뚜~~~~

실습해보기

ㅎㅎ 초심으로 돌아가서 프로젝트 생성부터 따라 가 봅시다.
빈 프로젝트를 생성합니다.

이름은 ViewLifeCycle.
코어 데이터도 사용하지 않을 것이고, ARC도 사용하지 않을 것이며, Unit Test도 포함하지 않을 것입니다.
ARC를 사용하지 않는 이유는, 우리가 원할 때 메모리 관리를 함으로써 더 명확히 흐름을 보여드리기 위함입니다.

자, 프로젝트를 생성했으면 ViewLifeCycle 폴더에서 오른쪽 버튼을 클릭.
New File...

Objective-C class를 선택하고 Next

TestViewController로 이름짓고 XIB생성에 체크합니다~

TestViewController가 생성되었으면 RootViewController도 만들어 주세요 🙂

자, 그리고 RootViewController.xib로 와서 Assistance 모드로 변경하면 이렇게 나오겠죠?
무슨 말인지 모르시는 분들은 
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기
를 참고해 주시면 됩니다 ㅎ
자, 여튼 xib파일을 클릭하고, RootViewController.h를 option+클릭하면 이런 화면이 나오겠죠.
xib파일에 버튼 세 개 가지런히 올려주시고, 저렇게 연결 해 줍니다.

나머지 두 버튼들도 이쁘게 연결 해 주시구요~^^

연결 해 주었으니 무엇을 할지 작성해 주어야겠죠?ㅎ
RootViewController.m 파일로 이동합니다.
이렇게 이쁘게 작성을 해 주세요.ㅎ 

#import 부터 저 쪼 아래까지 쭈욱 다 보셔야 해요 ㅎ

자, 그리고 AppDelegate로 옵니다.
이렇게 이쁘게 네비게이션 컨트롤러를 하나 만들어 주시구요 ㅎ

구현파일로 들어와서 이렇게 또 이쁘게 코딩을 합니다 ㅎ

자, 이제 TestViewController도 RootViewController에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ

그리고 구현파일로 와서 이렇게 작성을 해 주세요 ㅎ
MARKDOWN_HASH069a7617481a52f775c966a065009e89MARKDOWNHASH은 나중에 어떤녀석인지 알 수 있으실 거예요 ㅎ
앞에 언더바(
) 두개, 가운데 한 개, 뒤에 두 개 이렇습니다. ㅎ

자, 그리고 RootViewController 구현파일에도 와서 필요한 부분에 그녀석을 찍어 줍니다.

AppDelegate에도 마찬가지구요 ^^

자! 그리고 실행해 봅시다!
처음 로그는 애플리케이션을 실행시킨 후 네비게이션 push버튼을 누르고 다시 pop버튼을 누른 후에 나타난 로그입니다.

두 번째 로그는 애플리케이션을 실행시킨 후 모달뷰를 띄웠다가 다시 닫은 후에 나타난 로그입니다.

세 번째 로그는 애플리케이션을 실행시킨 후 addSubview와 removeSubview를 한 후의 로그입니다.

네 번째 로그는 애플리케이션 실행 후 홈버튼을 눌러서 백그라운드로 보낸 후 다시 애플리케이션을 띄운 후 다시 홈버튼을 누른 후에 생긴 로그입니다.

어떤가요? 여러분의 로그와 일치하나요?ㅎ

로그에 찍힌 것은,  -[해당 클래스명 메서드명] 이런식으로 남게 됩니다.

한 번 차근차근 로그를 따라서 추적해 보세요 ~^^

iOS Application Life Cycle

자, 그럼 실습을 해 보았으니 본격적으로 알아봅시다.

애플리케이션의 생명주기를 설명하는 그림으로 유명한 녀석입니다.ㅎ

  1. 사용자가 애플리케이션을 탭합니다.
  2. main() 함수가 호출됩니다.
  3. UIApplicationMain()이 호출됩니다.
  4. applicationDidFinishLaunching이 호풀됩니다. (AppDelegate)
  5. 여러분이 설계하고 작성한 애플리케이션의 코드가 동작합니다.
  6. 애플리케이션 종료를 명령하면 applicationWillTerminate가 호출됩니다. (AppDelegate)
  7. 애플리케이션이 종료됩니다.

자, 어떤가요? 감이오시나요?ㅎㅎㅎ

main은 뭐고 UIApplicationMain 은 또 뭐고...???

ㅎㅎ

모든 C언어 기반의 프로그램은 main함수에서 출발을 하게됩니다.

Objective-C로 엄연히 아랫단은 C언어 기반이므로 main함수로부터 출발을 하게되는 것입니다.

사실상 형식적이라고 볼 수 있습니다.

우리가 신경써야 할 부분은 AppDelegate의 applicationDidFinishLaunching 부터라고 생각하시면 됩니다.

로그에 applicationDidFinishLaunching이 가장 먼저 찍힌 것을 확인하셨나요?ㅎ 맞지요?ㅎ

그리고 로그에서는 확인 할 수 있을지 모르겠지만 applicationWillTerminate에서 우리가 할 수 있는 모든 것은 끝이나게 됩니다.

한 마디로 애플리케이션의 생명주기는 우리가 AppDelegate에서 확인하고 관리할 수 있습니다.

그렇다면 ViewController들의 생명주기는...???

iOS View Life Cycle

 
자, 애플리케이션 전체의 생명주기를 알아보았으니, 작게는 ViewController들의 생명주기에 대해 알아봅니다.

로그에 보면 ViewController의 로그 중에 가장 먼저 찍히는 녀석은 init(initWith....... 포함)입니다.

초기화 해 주는 녀석이 당연히 가장 먼저 호출이 되겠죠.

그 후에 바로 불리게 되는 녀석이 viewDidLoad입니다.

자동으로 생성되는 주석에 보면 이녀석에서 처음 부가적인 세팅을 하라고 써있죠.

눈치채신 분들도 계시겠지만 제가 아까 위에서 ViewController에 작성한 View Life Cycle의 메서드들은 순서대로 호출됩니다.

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

의 순서로 호출이 되게 됩니다.
그래서 viewDidUnload에서는 객체들을 놓아주는 곳으로 사용하라고 주석으로 설명이 되어있죠.

각각 호출되는 타이밍은 말씀드리지 않아도 아실 수 있을거라고 생각합니다...^^

영어 그대로 해석해 보세요..ㅎ

alloc, init, dealloc은 모든 객체에 공통적으로 해당되는 내용이므로 위에 나열하지는 않았습니다.

alloc - 메모리에 적재되는 시점
init - 객체가 초기화 되는 시점
dealloc - 객체가 메모리에서 해제되는 시점

dealloc은 실질적으로 해당 객체가 메모리에서 해제되는 시점(retainCount가 0이 되는 시점)에 호출되게 됩니다. 말그대로 alloc과 딱 반대개념이죠~

자, 이렇게 간략하게나마 애플리케이션과 뷰컨트롤러, 그리고 일반적인 객체의 생명주기에 대해 알아보았습니다.

제 설명이 어떻게 다가갔을지, 또 어떻게 느껴지셨을지 잘 모르겠지만, 궁금하거나 해결되지 않는 내용이 있었다면 꼭 말씀 부탁드립니다 🙂

사실 이 부분이 제가 초반에 제대로 개념을 잡아놓지 않아서 항상 혼돈을 겪었던 부분중에 하나기 때문에 필시 여러분께 도움이 될 것이라고 생각합니다.

그럼 이만...!

p.s 오늘은 6월 25일 6.25전쟁 62주년입니다.
우리나라의 평화와 안위를 위하여 목숨바친 순국선열께 감사하는 마음을 가지는 우리가 되었으면 좋겠습니다.

by yagom

facebook : https://facebook.com/yagompage

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

댓글 남기기

Close