'iOS View Life Cycle'에 해당되는 글 1건

  1. 2012.06.25 iOS개발하기 #43. iOS Application Life Cycle (20)

오늘의 주제

1. iOS 어플리케이션의 생명주기
2. 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에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ


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


자, 그리고 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 : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 초보자 2012.06.27 12:34  댓글주소  수정/삭제  댓글쓰기

    앗 강의 정말 잘봤습니다~^^ 많은 도움이 됐네요~ 계속 좋은 강의 부탁드려요~ㅋ

  2. 도레미 2012.06.28 15:06  댓글주소  수정/삭제  댓글쓰기

    강의 정말 잘보고 있습니다.
    나중에 스토리보드 쪽도 부탁드려요~^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.28 15:40 신고  댓글주소  수정/삭제

      안녕하세요 도레미님 :-)
      좋은 의견 고맙습니다..^^ 차차 준비해 보도록 하겠습니다.
      자주자주 놀러오세요 ㅎ

  3. Favicon of http://blog.naver.com/gamakun BlogIcon 까마쿤 2012.07.20 09:40  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 초보개발자 까마쿤입니다 :)
    블로그를 찾은지 얼마 되지않았지만 친절하신 설명에 감동하면서
    제가 필요한부분들을 쏙쏙찾은것 같아요 :-)
    마음같아선 1강부터 댓글을 달아드리고싶지만... 프로젝트 마감이 얼마 남지않아서..
    정말 감사합니다! 다음번에 시간되시면. 달력같은거 커스터마이징도 알려주시면 감사할거같아요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.20 12:43 신고  댓글주소  수정/삭제

      안녕하세요 까마쿤님~!
      찾아주셔서 정말 고맙습니다 :)
      도움이 되었다니 저도 정말 기쁩니다 ㅎ
      말씀해 주신 내용은 기회가 된다면 진행해 보도록 하겠습니다.
      많이 덥네요 ㅎ
      더위조심하시고 종종 들러주세요 ^^*

  4. Sio 2012.07.25 14:19  댓글주소  수정/삭제  댓글쓰기

    기본적인 건데 너무 건성으로 지나갔던것 같네요 ㅎㅎㅎ
    다시한번 정리되서 보게되서 많이 도움이 되었습니다~!
    잘보고갑니다~!!!!!

  5. 나에게넌 2012.08.14 16:06  댓글주소  수정/삭제  댓글쓰기

    주옥같은 강의..이제 2강 남았네요..어여 프로젝트 끝내시고 계속 올려주세요 ㅎ

    아직 우린 배울게 너무 많자나요 ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.14 16:51 신고  댓글주소  수정/삭제

      ㅎㅎ 매일 불같은 덧글 정말 고맙습니다~

      다시 복습하다 보면 또 새로울거라 믿습니다...ㅎㅎ

      필요하신 내용 있으면 말씀해 주세요~ :)

  6. 컴맹 2012.09.15 03:36  댓글주소  수정/삭제  댓글쓰기

    제목 그대로 라이프 사이클을 잘 설명해주셨네요.
    좋은 강의 감사합니다. ~~~ ^^

  7. Chris Jeong 2013.08.19 11:13  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다 ^^
    하나 궁금한 점은 각각의 단계(viewDidLoad, viewWillAppear 등)에서 개발자가 작성해줘야 하는 코드들이 분명 차이가 있을것 같은데 감이 잘 안오네요.
    안드로이드의 경우 onCreate에서는 생성시 1회만 초기화해 줘야 하는 부분들, onPause와 onResume에서는 리스너들의 등록, 해제를 하는데 ios에서는 어떤게 있는지 궁금하네요.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.08.19 13:29 신고  댓글주소  수정/삭제

      http://goo.gl/OL30zY
      http://blog.yagom.net/302
      참고해 보셔요..^^
      loadView - viewDidLoad - viewWillAppear - viewDidAppear 등이 있는데,
      최초 한 번 실행되는 것은 대부분 viewDidLoad에 채워줍니다 :)
      viewWillAppear, viewDidAppear 등은 상황에 따라 다시 실행 될 수 있습니다.

  8. 승군 2014.01.29 11:17  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌 잘 보고 있습니다

    감사합니다~~!!!

  9. 멋있으십니다 2015.03.27 18:30  댓글주소  수정/삭제  댓글쓰기

    야곰님 글은 진짜 하나하나 전부다 좋은정보네요 감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.03.28 17:39 신고  댓글주소  수정/삭제

      고맙습니다..^^;

      글이 오래되어 조금 다르거나 틀린 정보도 있으니 최신 정보를 찾아보시는 것도 좋을 것 같습니다.

      종종 들러주세요 :)

  10. 요청하나!! 2015.04.06 10:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 항상 좋은정보 알려주셔서 감사합니다.
    다름이 아니라 이번에 iOS objective c 를 이용하여 트위터 로그인하는것을 실습중에있습니다.
    혹시 실례가안된다면 objective c 를 이용한 IOS-Twitter로그인 연동과 그 로그인 한 사용자의 대한 id 와 이메일같은 정보를 로그로 띄울수있는 실습 한번 부탁드려도되겠습니까??

    이메일은 필수요소로 좀 부탁드리겠습니다..!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.06 13:37 신고  댓글주소  수정/삭제

      안녕하세요, 답변이 늦어졌습니다 ^^;

      제가 요즘 정신이 없어서 늦어졌어요.

      트위터 로그인과 관련된 내용은 트위터 개발자 페이지가 가장 정확하고 최신정보를 가지고 있지 않나 생각합니다 :)

      영어가 큰 문제가 되지 않는다면 https://dev.twitter.com/twitter-kit/ios/twitter-login 페이지를 참고해 보시는게 어떨까 합니다.

      yagomsoft@gmail.com

  11. 요청하나!! 2015.04.07 18:13  댓글주소  수정/삭제  댓글쓰기

    감사드립니다. 바쁘신데 고생하십니다!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.07 22:01 신고  댓글주소  수정/삭제

      큰 도움을 드리지 못해 죄송합니다.

      하다가 막히거나 궁금한 사항, 필요한 사항 생기시면 언제든 또 연락주세요.

      종종 들러주세요 :)