오늘의 주제

1. UIGestureRecognizer 사용해 보기


쉰 두번째 시간입니다.^^

정말 오래간만의 포스팅입니다 :)

오늘은 '새벽다섯시반'님의 요청으로 포스팅을 진행해 보도록 하겠습니다.

길게 눌렀을 때 특정 동작을 할 수 있도록 구현해보고 싶다고 말씀하셨습니다.

그녀석은 바로 Gesture Rcognizer!!

그럼 알아볼까요?

스따뚜~~~~~~~~~~~~



# Gesture Recognizer란?

말 그대로 유저의 제스쳐를 인식하는 녀석입니다.

양쪽위아래로 밀기(swipe), 꾹 누르기(long press), 탭하기(tap, 여러번도 포함) 등등 많은 제스쳐를 인식할 수 있지요.

자, 그럼 그녀석을 어떻게 사용하느냐?

따라오세요~


일단 프로젝트를 만들어야겠죠?ㅎ
 


네, 만듭니다. 옵션 체크된거 확인해 주시구요~


스토리보드로 와서 View 위에 ImageView를 하나 얹어주시구요. 사진은 넣고싶은거 넣으세요 ㅎㅎ

그리고 Object Library에서 Long Press Gesture Recognizer를 끌어다가 이미지뷰 위에서 올려놓습니다.

참, 이미지뷰의 속성에서 User Interactive Enable에 꼭 체크해 주시구요 :)



좌측에 생성된 Long Press Gesture Recognizer를 우클릭 또는 control + 클릭하여 Image View와 연결되어있는지 확인합니다.

 


그리고 우클릭 또는 control + 클릭으로 View Controller로 쭈욱 드래그 하신 후에 까만 창이 뜨면 delegate로 설정해 줍니다.

자, 스토리보드에서 준비는 끝났습니다.
 


이제 헤더로 와서 UIGestureRecognizerDelegate 프로토콜을 따르겠다고 이야기 해줍니다.


그리고 그녀석을 어떻게 써야할지 알아보기 위하여 도큐먼트를 한 번 훑어봐야겠죠?

UIGestureRecognizerDelegate위로 option(alt)키를 누른 상태로 커서를 올려봅니다.

그럼 위처럼 말풍선이 뜰텐데요, Reference를 클릭합니다.
 


자, 여기서 보면 델리게이트가 하는 일이 나와있네요.

우리에게 필요한 것은 꾸욱 눌렀을 때 어떻게 해줘야 할지를 정해주는 것이기 때문에 - gestureRecognizerShouldBegin: 을 클릭해서 자세한 내용을 봅시다.


요로코롬 어떤 녀석인지 상세하게 설명이 되어있네요 :)

한 번 쭈욱 읽어보시구요, 델리게이트 메소드 구현을 위해서 저녀석을 쭉 긁어서 복사해옵니다.

어디로? 구현파일로요 ㅋㅋ


참, 우리는 액션시트도 쓰려고 하니까 일단 우선 헤더파일에 액션시트 델리게이트를 하겠다고 이야기 해주구요,


아까 복사해둔 메소드를 이용해서 이렇게 구현해줍니다. 

그리고 실행!!!



 

짜잔~ 
잘 되시나요?
참 쉬죠잉~?

ㅋㅋ 여기에서는 Long Press Gesture Recognizer만 실습해 보았는데요,

다른 Gesture Recognizer들도 사용법은 비슷비슷 합니다.

다른 녀석으로 한 번 구현해 보세요.

참, 종류가 달라도 다들 UIGestureRecognizerDelegate 프로토콜을 따르게 됩니다.

즉, 위에서 본 델리게이트 메소드들을 적절히 잘 활용하면 여러 제스쳐를 한 번에 받고 처리할 수 있다는 이야기가 되겠지요?ㅎ

한 번 무슨말인지 고민해 보세요 :)

오랜만의 포스팅이었습니다.

많이 부족하고 허접한 블로그인데 이렇게 찾아주셔서 정말 고맙습니다 ^^

또 새로운 주제가 생기면 포스팅 하겠습니다.

그럼 다음에 뵈어요 :)

by yagom

facebook : http://www.facebook.com/yagomSoft

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

이 문서는 2013s 01. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
참고하시기 바랍니다.

공개 수배 합니다!
유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
모두 열정과 열의로 함께 작업하고 계십니다.
자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)
 

오늘의 주제

1. Manage App State Changes


파헤치기 다섯 번째 시간입니다.^^

이번 파트는 Scott Lim 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

자, 그럼 출발해 봅시다^^~
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile2.uf@1979C54150E41B6B32FD56.png%7Cwidth=%22212%22%20height=%22619%22%20alt=%22%22%20filename=%221.png%22%20filemime=%22image/jpeg%22%7C_##]
# App States and Multitasking





iOS 어플리케이션에서는, 당신의 어플리케이션이 "현재 실행(foreground)" 상태인지 "백그라운드실행상태(background)" 인지를 아는 것이 중요하다. 시스템 리소스가 iOS 장치에 매우 한계가 정해져 있으므로, 어플리케이션은 현재 실행상태일 떄보다 백그라운드 실행상태일때 다르게 작동해야만 한다. 운영체제 또한 배터리 수명을 향상시키고, 사용자들의 현재 실행중인 어플리케이션에 대한 사용경험을 향상시키기 위해 백그라운드 실행상태인 어플리케이션이 할 수 있는 것들에 한계를 두어야만 한다. 운영체제는 당신의 어플리케이션에게 실행중상태와 백그라운드 실행상태를 이동할 때마다 알려줄 것이다. 이런 알림은 당신의 어플리케이션의 동작을 수정하는 기회가 된다.
당신의 어플리케이션이 현재 실행중인 동안, 시스템은 프로세스처리(processing)를 위해 터치 이벤트를 어플리케이션에게 보낸다. UlKit 구조는 당신의 전용(custom) 오브젝트에 이벤트를 전달하기 위한 어려운 작업의 대부분을 수행한다. 당신이 해야하는 것은 이런 이벤트들을 처리하기 위해 적당한 오브젝트에 이 메소드를 오버라이드 하는 것이 전부다. 작동을 위해, UlKit 는 텍스트 필드의 값의 변화 같은 어떤 흥비로운 일이 발생할떄만 당신의 전용(custom) 코드를 불러낸다거나, 당신을 위한 터치 이벤트를 다루는 것으로 훨씬 간단하게 작동하도록 해준다.
당신의 앱을 구현하고 싶다면, 이 가이드라인을 따라하십시오.
- (필수사항) 발생하는 상태 변화(state transition) 에 적합하게 반응하십시오. 이러한 변화들을 적절하게 다루지 못하는 것은 데이터 손실이나 사용자들에게 나쁜 인상을 가져올 수 있습니다. 상태 변이에 반응하는 방법의 요약본을 찾는다면, "Managing App State Changes" 를 보십시오.

- (필수사항) 백그라운드 실행상태로 이동할 땐, 당신의 앱이 그 동작을 적절하게 조정할 수 있는지 확실하게 해라. 당신의 앱이 백그라운드 실행상태로 이동할 때, 해야하는 것들에 대한 가이드라인을 찾는다면, "Being a Responsible Background App" 를 보십시오.

- (권장사항) 당신의 앱이 필요로 하는 시스템 변화를 알려주는 모든 알림기능을 등록하십시오. 앱이 잠자기(suspended) 상태(아무 동작도 하지 않음)일 때, 시스템은 앱이 실행을 재개하게 될 때 키 알림을 보낸다(queue). 앱은 다시 실행으로 돌아가는 부드러운 변이를 만들어내기 위해 이런 알림기능을 사용해야만 한다. 더 많은 정보를 찾는다면, "Processing Queued Notifications at Wakeup Time" 을 보십시오.

- (선택사항) 만약 당신의 앱이 백그라운드 실행상태에서 실제 작업을 수행할 필요가 있는 경우, 시스템에게 실행을 계속할 수 있는 적합한 허용을 요청해라. 당신이 할 수 있는 백그라운드 실행상태에서의 작업의 종류와 그 작업을 하기 위해 허가를 요청하는 방법에 대해 알고 싶다면, "Background Execution and Multitasking" 을 보십시오.



Managing App State Changes
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@157A8F4150E41B7D31B6C7.png%7Cwidth=%22824%22%20height=%22295%22%20alt=%22%22%20filename=%223.png%22%20filemime=%22image/jpeg%22%7C_##]
어떤 주어진 상황에서든, 당신의 앱은 Table 3.1 에 나열된 상태 중의 한가지에 있어야 한다. 시스템은 시스템을 통해 일어나는 액션들의 반응으로 상태를 변화시킨다. 예를 들면, 사용자가 홈버튼을 눌렀을 때, 전화가 왔을 때, 또는 어떤 다른 인터럽션(interruptions)이 발생했을 때, 현재 실행중인 앱은 그에 대한 응답으로 상태를 변화시킨다. Figure 3-1 은 다른 상태로 변할 때 앱이 선택하게 되는 경로들을 보여준다.


Table 3-1    앱 상태들
실행중이 아님   :  앱이 실행되지 않았거나, 실행은 되고 있었으나 시스템에 의해 종료됨.

비활성 상태      :  앱이 실행상테에서(현재 메인 화면에서) 실행중이지만, 현재 이벤트를 받고 있지 않고 있다. (다른 코드를 수행하고 있을 수 있다.) 어플리케이션은 보통 다른 상태로의 변이가 일어날 때 일시적으로 이 상태에 머물러 있는다.

활성 상태  :  앱이 메인화면에서 실행중이고, 이벤트를 받고 있다. 이것은 실행상태의 앱의 일반적인 상태이다.
백그라운드 실행 상태 : 앱이 백그라운드 상태에 있으면서 코드를 수행하고 있다. 대부분의 앱들은 종료되어가는 과정에서 일시적으로 이 상태에 들어가게 된다. 그러나, 추가적인 실행 시간을 요청하는 앱은 일정 시간동안 이 상태에 남아있을 수 있다. 게다가, 바로 백그라운드 실행상태로 시작되는 앱은

비활성 상태(Inactive)대신 이 상태로 들어간다. 백그라운드 실행상태에 있는 동안 코드를 실행하는 방법에 대한 정보를 알고 싶다면, "Background Execution and Multitasking" 을 보십시오.

잠자기 상태  :  앱이 백그라운드 상태로 있지만, 코드를 수행하고 있지 않는다. 시스템은 그렇게 하기 전에 앱을 자동으로 이 상태로 옮기고 통지하지 않는다. 잠자기(suspended) 상태인 동안, 앱은 메모리에 남아있으나 어떤 코드도 수행하지 않는다. 메모리 부족 상태(low-memory)가 발생할 때, 시스템은 실행상태의 앱에 더 많은 공간을 만들어주기 위해 통지 없이 잠자기 상태(suspended) 앱들을 제거할 수 있다.

[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile24.uf@23307C3E50E41BA224ADE4.png%7Cwidth=%22824%22%20height=%22378%22%20alt=%22%22%20filename=%224.png%22%20filemime=%22image/jpeg%22%7C_##]Figure 3-1  





주의: iOS3.2 나 그 이전 버전에서 실행되는 앱들은 백그라운드 실행상태나 잠자기(suspended) 상태가 되지 못한다. 게다가, 어떤 장치들은 멀티태스킹이나 백그라운드 실행상태 수행을 전혀 지원하지 않는다,(심지어 iOS 4나 그 이후에서 실행되더라도). 이러한 장치들에서 실행되는 앱들은 또한 백그라운드 실행상태나 잠자기(suspended) 상태로 들어가지 못한다. 대신, 앱들은 실행상태를 떠나면서 종료된다.


[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@24307C3E50E41BA22512F1.png%7Cwidth=%22824%22%20height=%22150%22%20alt=%22%22%20filename=%225.png%22%20filemime=%22image/jpeg%22%7C_##]
대부분의 상태 변화는 당신의 앱에 delegate object 의 메소드에 따라 상응하는 호출에 동반된다. 이러한 메소드들은 적합한 방법으로 상태 변화에 응답하는 기회(chance)가 된다. 이러한 메소드들은 아래에 당신이 사용하는 방법의 요약과 함께 나와있다.


- application:willFinishLaunchingWithOptions : 이 메소드는 당신의 앱이 실행(Launch) 시에 코드를 수행하는 첫 번째 기회가 된다.

- application:didFinishLaunchingWithOptions : 이 메소드는 당신이 당신의 앱이 사용자에게 보여지기 전에 최종적으로 어떤 초기화든지 수행하도록 해준다.

- applicationDidBecomeActive : 당신의 앱이 실행상태로 막 되려고 한다는 것을 알게 해준다. 어떠한 마지막 준비 시기(preperation)에도 이 메소드를 사용해라. 
- applicationWillResignActive : 당신에게 당신의 앱이 실행상태에서 다른 상태로 변이될 것을 알려준다. 당신의 앱을 조용한(quiescent) 상태로 놓고자 할 때, 이 메소드를 사용해라.

- applicationDidEnterBackground : 당신에게 당신의 앱이 백그라운드 실행상태로 실행되고, 어떤 때든지 잠자기(suspended) 상태로 갈 수 있음을 알려준다.

- applicationWillEnterForeground : 당신에게 당신의 앱이 백그라운드 실행상태에서 나와서 실행상태로 돌아가는 것을 알게 해준다. 그러나, 아직은 실행상태는 아니다.

- applicationWillTerminate : 당신에게 당신의 앱이 종료될 것임을 알려준다. 이 메소드는 당신의 앱이 잠자기(suspended) 상태일 때는 호출되지 않는다.


The App Launch Cycle
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@25307C3E50E41BA226953B.png%7Cwidth=%22824%22%20height=%2283%22%20alt=%22%22%20filename=%226.png%22%20filemime=%22image/jpeg%22%7C_##]
당신의 앱이 시작되었을 때, 실행상태나 백그라운드 실행 상태로 이동하는 것이 아니라, 일시적으로 비활성상태를 통해 변이하게 된다. 실행 사이클의 부분으로서, 시스템은 프로세스를 만들고 당신의 앱을 위한 메인 쓰레드를 만들고, 당신의 앱의 메인 함수를 그 메인 쓰레드에 호출한다. 당신의 XCode 프로젝트와 함께 나오는 기본 메인 함수는 신속하게 컨트롤을 UlKit Framework 로  넘겨주는데, 이 컨트롤들은 당신의 앱을 초기화하고, 실행되는데 준비되도록 하는 작업의 대부분을 수행한다.
Figure 3-2 는 앱이 실행상태로 시작될 때, 호출된 앱 delegate 메소드를 포함해서 발생하는 이벤트들의 순서들을 보여준다.


Figure 3-2  앱을 실행상태로 시작하는 과정
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile26.uf@134E564D50E41BD3238DFF.png%7Cwidth=%22824%22%20height=%22501%22%20alt=%22%22%20filename=%227.png%22%20filemime=%22image/jpeg%22%7C_##]

만약 당신의 앱이 백그라운드 실행상태로 시작되었다면 - 보통 백그라운드 실행상태의 이벤트들을 다루기 위해 - 시작 사이클은 Figure 3-3 에 보인 것처럼 살짝 바뀐다. 중요한 차이점은 당신의 앱을 활성상태로 만드는 대신에, 이벤트를 다루기 위한 백그라운드 실행상태로 들어가서 그 후에 금방 잠자기(suspended) 상태가 된다. 백그라운드 실행상태로 시작했을때, 시스템은 여전히 앱 사용자의 인터페이스 파일을 로드하지만  앱 창에는 보여주지 않는다.



Figure 3-3 앱을 백그라운드 실행상태로 시작하는 과정
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@154E564D50E41BD424EBF4.png%7Cwidth=%22824%22%20height=%22621%22%20alt=%22%22%20filename=%228.png%22%20filemime=%22image/jpeg%22%7C_##]
당신의 앱이 실행상태 또는 백그라운드 실행상태로 시작되는지를 결정하기 위해서는, 당신의 application:willFinishLaunchingWithOptions: 또는 application:didFinishLaunchingWithOptions 델리게이트 메소드에 있는 공유된 UIApplication object 의 applicationState 프로퍼티를 체크하여라. 앱이 실행상태로 시작되었을 때는, 이 프로퍼티는 UIApplicationStateInactive 값을 포함한다. 앱이 비실행상태로 시작된다면, 프로퍼티는 UIApplicationStateBackground 값을 대신 포함한다. 당신은 당신의 델리게이트 메소드의 시작시간 행동을 조정하기 위해 이런 차이점들을 각각 맞추어 사용할 수 있다.

주의 : 앱이 URL을 열 수 있도록 시작되었을 땐, Startup 이벤트의 과정이 Figure 3-2, 3-3 에 보여진 것들과는 조금 다르다. URL을 열 때 발생하는 Startup 과정들에 대한 정보를 알고 싶으면, "Handling URL Requests" 를 보십시오.



About the main Function
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile4.uf@174E564D50E41BD5254F0D.png%7Cwidth=%22824%22%20height=%22262%22%20alt=%22%22%20filename=%229.png%22%20filemime=%22image/jpeg%22%7C_##] C 기반의 앱과 마찬가지로, iOS 앱의 주된 시작점은 메인 함수(main function)이다. iOS 앱에서 메인 함수는 최소한으로만 사용된다. 메인 함수의 주된 역할은 UlKit fraomwork 로 컨트롤을 전달하는 것이다. 그러므로, XCode 에서 당신이 만드는 어떤 새로운 프로젝트라도 Listing 3-1 에 보이는 것 처럼 기본 메인 함수를 가지고 시작한다. 거의 예외 없이, 당신은 이 함수의 구현을 결코 바꾸어선 안된다.


Listing 3-1   iOS 앱의 메인 함수
( 코드 내용 생략 )
 
주의 : 메모리 관리에서 autorelease pool 이 사용된다. 이는 functional block of code 동안 만들어지는 object의 release 를 지연시켜주는데 사용되는 Cocoa 메커니즘이다. autorelease pools 에 대한 더 많은 정보를 원한다면, Advanced Memory Management Programming Guide 를 보십시오.







UIApplicationMain 함수는 4개의 변수를 택하고, 이를 앱을 초기화하는 데 사용한다. 당신은 이 함수로 전해지는 초기 값들을 결코 바꾸어선 안된다. 그렇지만 그 목적이나 그들이 앱을 시작하는 방법 등을 이해하는 것은 중요하다.
- argc 와 argv 변수는 시스템으로부터 앱으로 전달되는 모든 시작 시간(Launch-time) 인수 (Arguments) 들을 포함한다. 이 인수들은 UlKit infrastructure 에 의하여 분석되고, 그렇지 않다면 무시될 수 있다.

- 3번째 변수는 중요한 앱 클래스의 이름을 식별한다. 이것은 앱을 실행하는데 책임이 있는 클래스이다. 이 변수에 nil 을 사용하길 권장하는데, 이는 UIKit 이 UIApplication 클래스를 사용하도록 유도한다.

- 4번째 변수는 당신의 전용(custom) 앱 델리게이트의 클래스를 식별한다. 당신의 앱 델리게이트는 시스템과 당신의 코드 사이의 수준높은 상호작용을 다루는 데 책임이 있다. Xcode 템플릿 프로젝트는 이 변수를 자동으로 적당한 값으로 세팅한다.


UIApplicationMain 함수가 하는 또다른 일은 앱의 메인 사용자의 인터페이스 파일을 로드(Load)하는 것이다. 주요 인터페이스 파일은 당신이 당신의 앱의 사용자 인터페이스에 보여주도록 계획한 초기 view-related objects 들을 포함한다. 스토리보드를 사용하는 앱에 대해선, 이 함수는 당신의 스토리보드로 부터 초기 뷰 컨트롤러를 로드하고 당신의 앱 델리게이트에 의해 공급된 윈도우에 그것을 설치한다.  nib 파일을 사용하는 앱에선, 그 함수는 메모리로 nib 파일의 내용을 로드한다, 그러나 당신의 앱 윈도우에는 설치하진 않는다; 당신은 당신의 앱 델리게이트의 application:willFinishLaunchingWithOptions: 메소드에서 그것들을 설치해야만 한다.

앱은 메인 스토리보드 파일이나 메인 nib 파일 중 하나를 가질 수 있다, 그러나 동시에 둘다 가질 수는 없다. 스토리보드는 당신의 앱의 사용자 인터페이스를 구체화하는 방법으로 선호된다. 하지만 iOS 모든 버전에 지원되지는 않는다. 당신의 앱의 메인 스토리보드 파일의 이름은 당신의 앱의 Info.plist 파일의 UIMainStoryboardFile 키값에 저장된다. (nib 기반 앱에 대해서는, 대신에 메인 nib file 의 이름이 NSMainNibFile 키에 저장된다.) 일반적으로, Xcode 는 당신이 프로젝트를 만들 때, 적당한 키값을 정한다, 그러나 필요하다면 당신은 그 값을 바꿀 수 있다.

Info.plist 파일과 당신의 앱을 설정하기 위해 그 파일을 사용하는 방법에 대한 더 많은 정보를 원한다면, "The information Property List File" 을 보십시오.


What to Do at Launch Time
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile3.uf@135A9F3350E41C22132B4A.png%7Cwidth=%22824%22%20height=%22134%22%20alt=%22%22%20filename=%2211.png%22%20filemime=%22image/jpeg%22%7C_##]
당신의 앱이 시작되었을 때 (실행상태든 백그라운드 실행상태든) 당신의 앱 델리게이트의 application:willFinishLaunchingWithOptions:와 application:didFinishLaunchingWithOptions: 메소드를 다음 내용을 구현하도록 사용하여라.

- 앱이 실행된 이유에 대한 정보를 찾는 실행 옵션 사전 (Launch options dictionary) 의 내용들을 확인하고, 알맞게 대응해라.

- 어플리케이션의 중요 데이터 구조를 초기화하여라.

- 보여질 앱의 윈도우와 뷰를 준비하여라.

OpenGL ES 를 사용하는 앱들은 그들의 그려낸 배경등을 준비하기 위해 이 방법을 써서는 안된다. 대신, 그들은 applicationDidBecomeActive: 메소드에 전달되는 모든 OpenGL ES 호출을 지연시켜야 한다.

[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile8.uf@145A9F3350E41C22142077.png%7Cwidth=%22824%22%20height=%22130%22%20alt=%22%22%20filename=%2212.png%22%20filemime=%22image/jpeg%22%7C_##]

만약 당신의 앱이 시작 시간에 자동으로 메인 스토리보드나 nib 파일을 불러오지 않는다면, 당신은 보여주기 위한 당신 앱의 윈도우를 준비하기 위하여 application:willFinishLaunchingWithOptions: 메소드를 사용할 수 있다.
가로, 세로방향을 전부 지원하는 앱에 대해선, 항상 당신의 메인 윈도우의 root view controller 를 세로 방향으로 설정하여라. 만약 장치가 시작 시간에 다른 방향으로 놓인다면, 윈도우를 보여주기 전에 시스템이 root view controller 에게 당신의 뷰를 올바른 방향으로 회전하라고 말해줄 것이다.

당신의 application:willFinishLaunchingWithOptions: 와 application:didFinishLaunchingWithOptions: 메소드들은 항상 당신의 앱의 시작 시간을 줄이기 위해 가능한 가벼워야만 한다. 앱들은 5초 이내에 그들 자신을 초기화하고 시작하고 이벤트들을 다루도록 기대되어 진다. 만약 앱이 적절한 시간에 시작 사이클을 완료해내지 못한다면, 시스템은 무반응 상태로 놓이기 전에 그것을 죽일 것이다. 이와 같이, 당신의 시작을 늦추는 어떤 작업들도(네트워크에 접속하는 것과 같은) 동시에 발생하지 않도록 2차 쓰레드에서 실행되어야만 한다.


실행상태로 시작할 때, 시스템은 실행 상태로의 변이를 완료하기 위해 applicationDidBecomeActive: 메소드를 호출한다. 이 메소드는 시작시간에도 그리고 백그라운드 실행상태로 변이할 때에도 호출되므로, 두 변이상태에 공통인 작업들을 수행하도록 그것을 사용하여라.
백그라운드 실행상태로 시작될 때, 도착한 각종의 이벤트들을 다루기 위해 준비상태가 되는 것 말고는 당신의 앱이 해야할 것들이 많지 않아야만 한다.






Responding to Interruptions
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile2.uf@122AFF3F50E41C791137FB.png%7Cwidth=%22824%22%20height=%22383%22%20alt=%22%22%20filename=%2213.png%22%20filemime=%22image/jpeg%22%7C_##] 전화가 왔을 때 처럼, 경보(alert) 기반의 인터럽션이 발생했을 때 어플리케이션은 사용자가 진행해야할 방법으로 유도해주기 위해서 일시적으로 비활성 상태로 이동한다. 앱은 사용자가 경보를 끝낼 떄까지 이 상태에 남아있는다. 이 지점에서, 앱은 활성 상태로 돌아가거나 백그라운드 실행상태로 이동한다. Figure 3-4는 경보기반의 인터럽션이 발생했을 때 당신의 앱을 통과하는 이벤트들의 흐름을 보여준다.
Figure 3-4. 경보기반 인터럽션을 다루기
(그림 생략)

[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@132AFF3F50E41C79128EC0.png%7Cwidth=%22824%22%20height=%2298%22%20alt=%22%22%20filename=%2214.png%22%20filemime=%22image/jpeg%22%7C_##] iOS5 에선, 배너를 보여주는 알림은 경보기반 알림이 하는 방식처럼 당신의 앱을 비활성화시키지는 않는다. 대신, 배너는 당신의 앱 윈도우의 가장 최상층에 놓이게 되고 당신의 앱은 전처럼 터치 이벤트를 계속해서 받는다. 그러나, 만약 사용자가 알림센터(notification center)를 드러내기 위해 화면을 위에서 아래로 끌어 내리면 당신의 앱은 경보기반 인터럽션이 발생했던 것처럼 비활성 상태로 이동한다. 당신의 앱은 사용자가 또다른 앱을 시작하거나, 알림 센터를 그만둘 떄까지 비활성 상태에 남아있게 된다. 이 지점에서, 당신의 앱은 알맞은 활성 상태나 백그라운드 실행 상태로 이동하게 된다. 사용자는 어떤 알림이 배너를 보여줄 것인지, 또 경보를 보여줄 것인지 설정하기 위해 앱 셋팅 (the Setting app) 을 사용할 수 있다.

Sleep/Wake 버튼을 누르는 것은 일시적으로 당신의 앱이 비활성화되도록 하는 인터럽션의 또다른 종류이다. 사용자가 이 버튼을 눌렀을 때, 시스템은 터치 이벤트를 불능 상태로 만들고 앱을 백그라운드 실행 상태로 옮긴다, 그러나 앱의 applicationState 프로퍼티 값을 UIApplicationStateInactive ( UIApplicationStateBackground 와는 반대로) 에 할당하고, 결국 화면을 잠근다(lock). 잠긴 화면은 파일을 암호화하기 위한 데이타 보호를 사용하는 앱들을 위해 부가적인 과정을 가지고 있다. 이런 과정들은 "What to Do When an Interruption Occurs" 에 설명되어 있다.



What to Do When an Interruption Occurs
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile30.uf@222AFF3F50E41C7A132410.png%7Cwidth=%22824%22%20height=%22253%22%20alt=%22%22%20filename=%2215.png%22%20filemime=%22image/jpeg%22%7C_##]
경보기반 인터럽션은 당신의 앱에 의해 일시적인 컨트롤의 손실을 낳게 된다. 당신의 앱은 실행상태로 계속 진행된다, 하지만 시스템으로부터 터치 이벤트를 받지는 않는다.(알림 및 가속센서같은 이벤트의 종류는 계속해서 받는다.) 이 변화에 대응하여, 당신의 앱은 applicationWillResignActive: 메소드에 있는 다음의 사항을 해야만 한다.

- 타이머와 다른 주기적인 작업등을 멈춘다.
- 실행중인 모든 메타데이타 쿼리를 멈춘다.
- 어떤 새로운 작업도 시작하지 않는다.
- 동영상 재생을 멈춘다 (Airplay 인 경우만 제외하고)
- 만약 앱이 게임 중이면, 멈춤 상태(Pause state) 로 들어간다.
- OpenGL ES 의 Frame rate 를 줄인다.
- 중요하지 않은 코드를 실행하는 모든 전송 혹은 작동 큐를 중단한다(suspend).


당신의 앱이 활성 상태로 돌아갔을 때, applicationDidBecomeActive: 메소드는 applicationWillResignActive: 메소드에서 행한 모든 과정을 되돌린다. 이와 같이 재활성화 때엔 당신의 앱은 타이머를 재시작해야하고, 전송 큐를 재개해야 하고, OpenGl ES 의 Frame rate 를 다시 높여야 한다. 그러나, 게임은 자동으로 재게되지는 않는다; 게임은 사용자가 재개하기를 선택할 때 까지는 멈춤 상태로 남아있는다.

사용자가 Sleep/Wake 버튼을 눌렀을 때, NSFileProtectionComplete 보호 옵션에 의해 보호된 파일을 가진 앱들은 그 파일에 관련된 모든 레퍼런스(reference)를 닫아야만 한다. 적당한 패스워드로 설정된 장치들에서는, Sleep/Wake 버튼을 누르는 것은 화면을 잠그고, 시스템은 확실한 보호가 실행된 파일에 대한 해독 키를 사라지게끔(throw away)한다. 스크린이 잠겼을 때, 파일에 상응하는 모든 접근 시도는 무시된다. 그러므로 만약 그러한 파일을 당신이 가지고 있다면, 당신은 applicationWillResignActive: 메소드에 있는 관련된 모든 레퍼런스를 닫아야 하고, applicationDidBecomeActive: 메소드에 있는 새로운 레퍼런스를 열어야 한다.


Adjusting Your User Interface During a Phone Call



사용자가 전화를 받았을 때, 그리고 전화받는 도중 당신의 앱으로 돌아왔을 때, 상태 바(status bar) 의 세로길이는 사용자가 전화하고 있다는 사실을 나타내기 위해 커지게 된다. 비슷하게, 사용자가 전화를 끝마쳤을 때, 상태 바는 보통 사이즈로 줄어든다.
상태 바의 변화를 다루는 가장 좋은 방법은 당신의 뷰를 관리하도록 뷰 컨트롤러를 사용하는 것이다. 당신의 인터페이스에 설치되었을 때, 뷰 컨트롤러는 자동으로 상태 바 프레임 사이즈가 변할 때 그 관리되는 뷰들의 세로 길이를 조절한다.
만약 당신의 앱이 어떤 이유로 뷰 컨트롤러를 사용하지 않는다면, 당신은 UIApplicationDidChangeStatusBarFrameNotification 의 알림에 수동으로 등록함으로써 상태 바 프레임의 변화에 대응해야 한다. 이 알림에 대한 처리 부분은 상태 바의 세로 길이를 받아서 당신의 앱의 뷰에 알맞게 적응되도록 이를 사용해야 한다.



Moving to Background
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@0260433D50E41CC92ACB16.png%7Cwidth=%22824%22%20height=%22579%22%20alt=%22%22%20filename=%2217.png%22%20filemime=%22image/jpeg%22%7C_##]사용자가 홈버튼을 눌렀을 때, Sleep/Wake 버튼을 눌렀을 때, 또는 시스템이 다른 앱을 시작했을 때, 실행상태의 앱은 비활성 상태로, 그리고 백그라운드 실행 상태로 변이한다. 이런 변이는 Figure 3-5. 에 보이는 것 처럼 앱 델리게이트의 applicationWillResignActive: 와 applicationDidEnterBackground: 메소드들을 호출하는 결과를 가져온다. applicationDidEnterBackground: 메소드에서 온 다음에, 대부분의 앱들은 결국 곧 잠자기(suspended) 상태로 이동한다. 백그라운드 실행 상태의 특정 작동을 요청하거나 (음악을 재생하는 것과 같은) 시스템으로부터 짧은 추가 실행 시간을 요청하는 앱들은 조금 더 길게 실행이 이어질 수 있다.
Figure 3-5.  실행 상태에서 백그라운드 실행 상태로의 이동 (Moving from the foreground to the background)
( 그림 생략 )

주의 : 앱들은 멀티태스킹을 지원하는 장치에서만 그리고 iOS4.0 이나 이후 버전을 실행하는 장치에서만 백그라운드 실행상태로 이동한다. 다른 모든 경우에선, 앱은 백그라운드 실행상태로 이동되는 대신 종료된다(메모리에서 부터 제거된다).


What to Do When Moving to Background




앱들은 백그라운드 실행상태로 움직이는 것에 대비해서 applicationDidEnterBackground: 메소드를 사용할 수 있다. 백그라운드 실행상태로 이동할 때, 모든 앱들은 다음의 내용을 해야만 한다.
- 현재 상태 이미지가 찍히는 것에 대한 준비를 해라. 
applicationDidEnterBackground: 메소드가 돌아왔을 때, 시스템은 당신의 앱의 사용자 인터페이스의 상태를 찍는다(picture). 그리고 변이될 에니메이션을 위한 결과 이미지를 사용한다. 만약 당신의 인터페이스의 어떤 뷰라도 민감한 정보를 포함하고 있다면, applicationDidEnterBackground: 메소드가 돌아오기 전에 그런 뷰들을 숨기거나 수정해야만 한다.

- 사용자 데이터와 앱 상태 정보를 저장해라.
모든 저장되지않은 변화들은 백그라운드 실행상태로 들어갈 때 디스크에 기록되어야만 한다. 이 단계는 당신의 앱이 백그라운드 실행 상태에 있는 동안 수많은 사유로 인해 조용히 종료될 수 있으므로 매우 필요하다. 당신은 필요에 따라 이 작업을 백그라운드 실행상태 스레드에서 수행할 수 있다.

- 가능한한 많은 메모리를 비워놓아라(Free up).
무엇을 해야하고, 왜 이것이 중요한지에 대한 더 많은 정보를 원한다면, "Memory Usage for Background Apps" 를 보십시오.

당신의 앱 델리게이트의 applicationDidEnterBackground: 메소드는 대략 모든 업무를 종료하고 돌아오는 데 5초를 가진다. 실제로, 이 메소드는 가능한 빠르게 돌아와야만 한다. 만약 메소드가 시간이 끝나기 전에 돌아오지 못한다면, 당신의 앱은 메로리로부터 종료될 것이다. 만약 당신이 여전히 작업들을 수행하는 데 더 많은 시간을 필요로 한다면, 백그라운드 실행상태의 실행 시간을 요청하기 위한 beginBackgroundTaskWithExpirationHander: 메소드를 호출하여라 그리고 2차 스레드에서 오래 걸리는 작업들을 시작해라. 당신이 어떤 백그라운드 실행상태 작업들을 실행했더라도, applicationDidEnterBackground: 메소드는 여전히 5초 내에 종료해야만 한다.


주의 : UIApplicationDidEnterBackgroundNotification 알림은 또한 당신의 앱의 특정한 부분들에게 백그라운드 실행상태로 들어간다는 것을 알리기 위해 전송된다. 당신의 앱의 오브젝트들은 이 알림에 대한 등록을 위해 이 기본 알림 센터를 사용할 수 있다.

당신의 앱의 특징들에 따라, 백그라운드 실행상태로 들어갈 때, 당신의 앱이 해야만 하는 다른 것들이 있다. 예를 들면, 모든 활성상태의 Bonjour 서비스들은 잠자기(suspended) 상태로 가야만 한다. 그리고 앱은 OpenGl ES 함수들을 호출하는 것을 멈춰야만 한다. 백그라운드 실행상태로 들어갈 때 당신의 앱이 해야만 하는 것들의 목록을 보려면, "Being a Responsible Background App" 를 보십시오.


Memory Usage for Background Apps
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile24.uf@14349C4450E41CE11F0AB6.png%7Cwidth=%22824%22%20height=%22238%22%20alt=%22%22%20filename=%2219.png%22%20filemime=%22image/jpeg%22%7C_##]
모든 앱들은 백그라운드 실행상태로 들어갈 때 실용적일 수 있을 만큼 많은 메모리를 비워놓아야만 한다. 시스템은 할 수 있는 한 동시에 메모리에 많은 앱들을 유지하려고 한다. 그러나 메모리가 부족할 때, 시스템은 메모리를 회복하기 위해 잠자기(suspended) 상태의 앱들을 종료한다. 백그라운드 실행상태에 있을 때 많은 양의 메모리를 소비하는 앱들은 종료되어야 할 첫번째 앱이 될 것이다.
실용적으로 말해서, 당신의 앱은 strong 레퍼런스가 더이상 필요하지 않게 되는 즉시 제거해야만 한다. strong 레퍼런스들을 제거하는 것은 컴파일러가 상응하는 메모리가 회복될 수 있도록 바로 오브젝트들을 release하게 해준다. 그러나 만약 당신이 퍼포먼스를 향상시키기 위해 일부 오브젝트들을 캐시(cache)에 저장하길 원한다면, 당신은 그 레퍼런스들을 제거하기 전에 앱이 백그라운드 실행상태로 변이될 떄까지 기다려야만 한다.

당신이 가능한 빠르게 strong 레퍼런스들을 제거해야만 하는 오브젝트들의 예들은 다음을 포함한다 :

- 이미지 오브젝트
- 당신이 디스크로부터 다시 불러올 수 있는 큰 미디어 혹은 데이타 파일들
- 당신의 앱이 필요로 하지 않고, 나중에 쉽게 다시 만들 수 있는 다른 모든 오브젝트들

당신의 앱의 메모리 흔적들을 줄이기 위해, 시스템은 당신의 앱이 백그라운드 실행상태로 이동할 때 당신의 앱을 대신해서 할당된 일부 데이터들을 자동으로 삭제한다.

- 시스템은 모든 Core Animation Layers 에 쓰이는 backing store 를 삭제한다.(?) 이런 수행은 메모리로부터 당신의 앱의 layer 오브젝트들을 삭제하지 않고, 현재의 layer 프로퍼티들을 바꾸지도 않는다. 그것은 단순히 그런 레이어의 컨텐츠들이 스크린에 등장하는 것을 막는데, 이는 백그라운드 실행상태의 앱이 어떻게든 실행되지 않도록 주어진다.

- 캐쉬에 저장된 이미지들의 시스템 레퍼런스들을 삭제한다. (만약 당신의 앱이 이미지들에 strong 레퍼런스를 가지고 있지 않다면, 그들은 메모리로부터 차후에 삭제될 것이다).

- 다른 시스템에 의해 관리된 캐쉬 데이터들의 strong 레퍼런스 들을 삭제한다.


Returning to the Foreground



실행상태로 돌아오는 것은 앱이 백그라운드 실행상태로 갔을 때 멈췄던 작업들을 다시 시작할 기회이다. 실행상태로 이동할 때 발생하는 단계들은 Figure 3-6. 에 나와있다. applicationWillEnterForeground: 메소드는 당신의 applicationDidEnterBackground: 메소드에서 행해진 모든 것들을 되돌려야(undo) 한다. 그리고 applicationDidBecomeActive: 메소드는 시작시간에 있었던 동일한 활성화 작업들을 계속해서 수행해야 한다.

Figure 3-6. 백그라운드 실행상태에서 실행상태로의 변이 (Transitioning from the background to foreground)

(그림 생략)


주의 : UIApplicationWillEnterForegroundNotification 알림 또한 당신의 앱이 실행상태로 다시 들어갈 때 트랙킹하는 데 사용될 수 있다. 당신이 앱의 오브젝트들은 이 알림에 등록을 위한 기본 알림 센터를 사용할 수 있다.



Processing Queued Notifications at Wakeup Time
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile27.uf@2136443F50E41D0804B24A.png%7Cwidth=%22824%22%20height=%22109%22%20alt=%22%22%20filename=%2221.png%22%20filemime=%22image/jpeg%22%7C_##]
잠자기(suspended) 상태에 있던 어플은 실행상태나 백그라운드 실행상태로 돌아올 때 모든 대기중인 알림을 다룰 준비가 되어있어야 한다. 잠자기(Suspended) 상태 앱은 어떤 코드도 실행하지 못하므로 가로,세로의 방향 변화, 시간 변화, 설정(preference) 변화 및 앱의 보이는 모습이나 상태에 영향을 줄 수 있는 다른 많은 것들에 관련된 알림을 처리할 수 없다. 이런 변화들이 손실되지 않게끔 확신하기 위해서, 시스템은 많은 관련 알림들을 큐로 내보내고 다시 코드를 시작하는 순간 (실행상태이든 백그라운드 실행상태이든) 앱에게 그 내용들을 전달한다. 재개했을 때, 알림이 오버로딩되는 걸 막기 위해서, 시스템은 이벤트들을 합치고 앱이 잠자기(suspended) 된 이후의 순수 변화만을 반영하는 하나의 알림 (또는 각각 관련된 타입들)을 전달한다.
Table 3-2. 는 합쳐져서 당신의 앱으로 전달될 수 있는 알림들을 나열했다. 이 알림들의 대부분은 등록된 옵저버들에게 직접적으로 전달된다. 장치의 화면 출력방향 (가로, 세로) 변화에 관련된 것들은 일반적으로 시스템 framework 에 의해 인터셉트되어 다른 방식으로 당신의 앱에게 전달된다.
Table 3-2.  깨어있는 앱들에 전달되는 알림들 (Notifications delivered to waking apps)



- 악세사리가 탈착 또는 부착될 때
- 기기의 가로 또는 세로로 방향 전환을 할 때
- 시간대가 변경될 때
- 배터리가 저전력 상태로 변경될 때
- 근접 센서가 작동할 때
- 보호된 파일이 변경되었을 때
- 외부 디스플레이에 연결되거나 해제되었을 때
- 디스플레이 모드가 변경되었을 때
- 설정 앱에서 내 어플의 설정이 변경되었을 때
- 언어 또는 지역이 변경되었을 때
- 사용자의 iCloud 계정이 변경되었을 때

[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile1.uf@14343D4050E41D290FFDD1.png%7Cwidth=%22824%22%20height=%2293%22%20alt=%22%22%20filename=%2223.png%22%20filemime=%22image/jpeg%22%7C_##]대기된 알림들은 당신의 앱의 메인 run loop 에 전달되고 일반적으로 다른 터치 이벤트나 다른 사용자 입력 이전에 전달된다. 대부분의 앱들은 재개되었을 때 사용자가 알아차릴 수 있는 정도의 지연이 일어나지 않을 정도로 충분히 신속하게 이런 이벤트들을 전달할 수 있어야만 한다. 그러나, 만약 당신의 앱이 백그라운드 실행상태에서 돌아왔을 때 느리게 움직이는 모습을 보인다면 당신의 알림 전달 코드가 그 지연을 일으키고 있는지 결정할 Instruments 를 사용해라.

실행상태로 돌아온 앱은 또한 마지막 업데이트 이후로 어지러워진(marked dirty) 어떤 뷰에 대해서도 뷰-업데이트 알림을 받는다. 백그라운드 실행상태에서 돌아가고 있는 앱은 여전시 setNeedDisplay 나 setNeedsDisplayInRect: 메소드들을 그 뷰의 업데이트를 요청하기 위해 호출할 수 있다. 그러나, 뷰들은 보이지 않기 때문에, 시스템은 요청들을 합치고, 앱이 실행상태로 돌아오고 난 뒤에 뷰들을 업데이트한다.


Handling iCloud Changes



만약 iCloud 의 상태가 어떤 이유든지 변하게 되면, 시스템은 당신의 앱에 NSUbiquityIdentityDidChangeNotification 알림을 전송한다. iCloud 상태는 사용자가 iCloud 계정에 로그인 혹은 아웃을 하거나 문서와 데이터의 싱크(syncing)가 가능해지거나 불가능해지는 상태로 변하게 된다. 이 알림은 변화를 수용하기 위한 캐시메모리나 모든 iCloud 관련 사용자 인터페이스 요소들을 업데이트하라는 신호이다. 예를 들면, 사용자가 iCloud 로그아웃을 했을 경우, 당신은 iCloud 기반의 모든 파일과 데이터들의 reference 를 삭제해야만 한다.

만약 당신의 앱이 이미 iCloud 에 파일을 저장할 것인지에 대해 사용자에게 전달하였다면, iCloud 상태가 변했을 때 다시 전달할 필요는 없다. 사용자에게 처음으로 전달한 후에, 당신의 앱의 위치 설정들에서 사용자의 선택을 저장해라. 당신은 그러고 나면 그 설정을 Setting 번들을 사용하거나 당신의 앱의 옵션으로서 드러내길 원할수도 있다(?). 그러나 설정이 현재 사용자 기본 데이터베이스에 있지 않다면, 그 프롬프트를 반복할 필요는 없다.


Handling Locale Changes Gracefully
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@16316C4650E41D4D06368A.png%7Cwidth=%22824%22%20height=%22138%22%20alt=%22%22%20filename=%2225.png%22%20filemime=%22image/jpeg%22%7C_##]만약 사용자가 당신의 앱이 잠자기(suspended) 되어있는 동안 현재 언어를 변경한다면, 당신은 당신의 앱이 실행상태로 돌아왔을 때, 날짜, 시간, 숫자같은 지역(Locale)에 민감하게 관련된 정보들을 담고 있는 모든 뷰를 업데이트하도록 NSCurrentLocaleDidChangeNotification 알림을 사용할 수 있다. 물론, 언어관련된 문제점들을 피하는 가장 좋은 방법은 당신의 코드를 업데이트 뷰를 쉽게 만들 수 있는 방법으로 작성하는 것이다. 예를 들면:

- NSLocale 오브젝트들을 다시 받았을 때, autoupdatingCurrentLocale 클래스 메소드를 사용하여라. 이 메소드는 변화에 대응해서 자동으로 스스로를 업데이트 해주는 지역기반 오브젝트를 반환한다. 그래서 당신은 그것을 다시만들 필요가 없다. 그러나, 지역 변화가 일어났을 때, 당신은 여전히 현재 지역에서 전달된 내용을 포함하고 있는 뷰들을 리프레쉬 해줄 필요가 있다.

- 현재 지역 정보가 변할 때마다 캐쉬에 저장된 날짜나 숫자 formatter 오브젝트들을 다시 만들어라.
지역 변화를 다루도록 당신의 코드를 세계화하는 데 더 많은 정보를 찾는다면, Internationalization Programming Topics 를 보십시오.


Responding to Changes in Your App's Settings



만약, 당신의 앱이 셋팅 앱(Setting app)에 의해 관리되는 셋팅을 가졌다면, 당신의 앱은 NSUserDefaultsDidChangeNotification 알림을 관찰해야만 한다. 사용자는 당신의 앱이 잠자기(suspended) 상태이거나 백그라운드 실행상태인 동안 셋팅을 수정할 수 있으므로, 그러한 셋팅에서 중요한 모든 변화에 대해 응답하기 위한 이런 알림을 사용할 수 있다. 어떤 경우에서는, 이 알림에 대해 응답하는 것이 잠재적인 보안 구멍을 없애는 데 도움을 줄 수 있다. 예를 들면, 이메일 프로그램은 사용자의 계정 정보의 변화에 반응해야만 한다. 이런 변화들의 감지 실패는 프라이버시, 보안 문제점들을 야기시킬 수 있다. 구체적으로, 현재 사용자들은 계정이 더이상 그 사람에게 속해있지 않은 경우에도 예전의 계정 정보를 사용하여 이메일을 보낼 수도 있다.


NSUserDefaultsDidChangeNotification 알림을 받을 때, 당신의 앱은 모든 관련 셋팅들을 다시 로딩해야만 하고, 필요하다면 그 사용자 인터페이스를 적절하게 리셋해야 한다. 비밀번호나 다른 보안관련 정보가 변경된 경우에는, 당신은 또한 이전에 표시된 정보들을 가려야만 하고, 사용자들에게 새로운 비밀번호를 입력하도록 만들어야 한다.


App Termination
[##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile4.uf@203FD84550E41D6E22F083.png%7Cwidth=%22824%22%20height=%22233%22%20alt=%22%22%20filename=%2227.png%22%20filemime=%22image/jpeg%22%7C_##]비록 일반적으로 앱들이 백그라운드 실행상태나 잠자기(suspended) 상태로 이동하였더라도, 다음에 나오는 조건들이 참값이라면, 당신의 앱은 종료되고, 메모리로부터 삭제된다.
- 앱이 iOS 4.0 이전의 버전에 반하는 연결이 되었다.
- 앱이 iOS 4.0 이전의 버전을 실행하는 장치에 배치되었다.
- 현재 장치가 멀티테스킹을 지원하지 않는다; "Determining Whether Multitasking Is Available)"을 보십시오.
- 앱이 Info.plist 파일에 UIApplicationExitsOnSuspended 키를 포함한다.; "Opting out of Background Execution" 을 보십시오.


만약 당신의 앱이 (실행상태든 백그라운드 실행상태든) 종료 시기에 실행되고 있다면, 시스템은 당신의 앱 엘리게이트의 applicationWillTerminate: 메소드를 호출하여 당신이 필요한 모든 정리(Cleanup) 을 수행할 수 있게 해준다. 당신은 현재 상태를 다음 실행 때 복원하기 위해 사용하게 되는 앱 상태 정보나 사용자 데이터 등을 저장하기 위해 이 메소드를 사용할 수 있다. 당신의 메소드는 모든 작업을 수행하고 반환하는 데 약 5초의 시간을 가질 수 있다. 만약 시간 내에 반환하지 못한다면, 앱은 메모리로부터 삭제되고 종료될 것이다.

중요: TheapplicationWillTerminate: 메소드는 만약 당신의 앱이 현재 잠자기(suspended) 상태라면 호출되지 않는다.


당신이 당신의 앱을 iOS SDK4 나 이후 버전을 사용해서 개발하는 경우, 당신은 아무 통지없이 당신의 앱이 종료되는 것에 대해 준비되어야만 한다. 사용자는 멀티태스킹 UI 를 사용하여 분명하게 앱을 종료시킬 수 있다. 게다가, 만약 메모리가 제한되었다면, 시스템은 더 많은 공간을 만들어내기 위해 앱을 메모리로부터 제거할 수도 있다. 잠자기(suspended) 상태의 앱들은 종료의 통지를 받지 않는다, 그러나 만약 당신의 앱이 백그라운드 실행 상태(잠자기(suspended) 상태가 아니라)에서 현재 돌아가고 있다면, 시스템은 당신의 앱 델리게이트의 applicationWillTerminate: 메소드를 호출한다. 당신의 앱은 이 메소드로부터 추가적인 백그라운드 실행상태 수행 시간을 요청할 수 없다.




by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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





저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 계산기 기능 넣기
2. 메모장 화면 구성 바꾸기



쉰 한 번째 시간입니다.^^

지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
이제 계산기 로직을 완성해 볼 차례입니다.

아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


# 계산기 기능 완성하기

일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

enum이 뭔지 잘 모르겠다 하시는 분들은
2012/05/24 - [C] - C <20>. enum 

을 참고해 주세요 ㅎㅎㅎ


자, 이제 다시 구현파일로 넘어와서~

일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
(현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
switch문이 아직도 헷갈리는 분들은
2011/12/14 - [C] - C <7>. 조건문(2) switch 
참고 해 주시면 좋을 것 같네요 ㅎㅎ 


자, 그리고 나서 실행 해 봅니다. command + R
어때요 ㅎㅎㅎ 잘 동작하나요?
이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
네......그렇죠 ㅎㅎㅎ
2 + 3 하고 = 을 누르면 5가 나옵니다.
그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그래서 수정해 줬습니다.
헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



자, 그리고 다시 실행!!!!!!

어떠세요? 잘 동작하나요?

제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



# 메모장 화면구성 변경

지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

자, 이제 본격적으로 메모장 구현은?

다음 포스팅에......ㅋㅋㅋ



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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






저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 Tip

1. 스토리보드가 xml로 나올 때 스토리보드 화면으로 나오도록 열기


# 스토리보드야 나와줘!!!

으히히, 가끔 스토리보드 기반으로 작업하다보면 xCode가 멍때리는지 스토리보드가 아닌 xml문서로 열리는 경우가 가끔 생깁니다.
아래 화면처럼요.


자, 그럼 스토리보드로 열어 봅시다.
이렇게요 ㅎㅎ .storyboard파일에서 우클릭 또는 ctrl 클릭 하면 팝업메뉴가 나오죠. 거기서 Open As - Interface Builder를 선택해 줍니다.



짜잔~~~~~~~~~~~~~~~~~



초간단 팁 끝~~~~~~~~~

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 실전 프로젝트 생성



벌써 쉰 번째 시간입니다.^^

많이도 써왔나 보네요...ㅎㅎ
벌써 오십번 째 글이라니 +_+

이거 한 편 쓰는데 시간이 얼마나 오래걸리는지 여러분들을 모르실거예요..ㅋㅋㅋㅋㅋㅋㅋ

이제 실전 프로젝트(?) 라고 하기는 좀 그렇지만 예제 앱을 하나 만들어 볼까해요.
물론 저는 디자인을 하지 못하기 때문에 그냥 있는 그대로의 녀석들을 쓰겠지만 말예요..ㅎㅎ

간단한 계산기랑 메모장(?) 정도를 만들어 볼까해요.
단순히 감을 익히는데에는 큰 무리가 없을 것이라고 봅니다.

스토리보드를 원하는 분들이 많이 계셔서, 간단한 앱이기도 하니까 스토리보드와 ARC를 사용하여 진행하도록 하겠습니다.

iOS5.1 Xcode 4.3.3 기준입니다.

오늘의 간단 결과물입니다.
미리보기 +_+ㅋㅋㅋ


한 번 출발해 봅니다 ㅎㅎ

# 프로젝트 생성

우리는 두 개의 탭을 가진 탭바 기반 어플리케이션을 만들거예요.


스토리보드와 ARC사용에 체크를 했구요~



# 화면구성하기

짜잔~ 제 포스팅에서 처음으로 스토리보드가 등장을 했군요..ㅎㅎㅎ
저는 좀 구식이라 스토리보드는 저도 아직 잘 사용할 줄 모릅니다 ㅎㅎ 
눈에 보여서 편하긴 한데, 그만큼 뭔가 댓가가 있겠죠?ㅎㅎ 여튼 잡소리는 그만하고, 계속 가 봅니다 ㅋㅋㅋㅋㅋㅋ 


자, 일단 First View는 계산기로 사용하려고 해요.

뷰 속성에 들어가서 배경색을 그럴싸하게 좀 바꿔주고~ (그래봐야... 뭐... 쩝..ㅋㅋㅋㅋㅋㅋㅋ 그래도 기본만으로 뭔가 할 수 있게 해준 애플의 디자인 센스는 좋습니다ㅋㅋ)


First View라고 써있던 라벨의 위치와 크기를 적절히 조절해주고 오른쪽 정렬~ 그리고 0으로 세팅해줍니다 ㅎ


자, 그리고 뭔가 계산기처럼 그럴싸하게 버튼들을 넣어주세요 ㅋㅋㅋ


그리고 어시스턴스 모드로 전환해서 아울렛 연결하는 방법 다들 아시죠?ㅎㅎㅎ
오른쪽 버튼 드래그 또는 컨트롤 키 누르면서 드래그!!
라벨의 property 생성해 줍니다~
요게 잘 이해가 안되신다면?
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고하시면 되겠습니다 ㅎㅎ


그리고 두번째 탭에 있던 뷰도 텍스트뷰 하나 올려주시고, 버튼 두개 올려서 아울렛이랑 액션 연결 해 주세용~ 


자. 이거 좀 헷갈리실 수 있는데, 0부터 9까지 한 메소드에 연결을 할 거예요.
0에서 액션을 하나 생성해 주시고, 1~9까지 같은 메소드 자리로 연결하시면 됩니다. 자세한 설명은 그림에~! 
점(.)을 포함한 기능키들은 아래에서 또 따로 해줄거예요~ 



자, 기능키들도 하나의 액션 메소드에 연결해 줍니다. 방법은 동일해요~


자, 그리고 버튼마다 태그를 지정해 줍니다.
0번 버튼은 0
1번 버튼은 1...
9번까지 태그를 지정해 줍니다. 



그리고 기능버튼들도 마찬가지 입니다.

 
+ : 100, - : 101, * : 102, / : 103, C : 104, = : 105, . : 106


자, 이렇게 106번까지요 ㅎ


자, 이렇게 화면구성은 대강 마무리 된 것 같군요~

그럼 계산기로 사용될 FirstViewController에 와서 코딩을 좀 해봅시다 ㅎㅎ
일단 사용하여야 할 변수들을 선언해 주시구요.
추후에 수정하였는데 CGFloat이 아니라 double로 선언해주세요!!! 꼭이요!!!



아까 태그달았던 버튼들 나중에 번호 헷갈릴게 분명합니다.
벌써부터 헷갈리는데요?ㅎㅎ
enum을 사용하여 우리가 알아보기 쉽게 만들어 줍시다.

내려와서...
변수 초기화 잊지 말아주시구요 :)
숫자 버튼을 눌렀을 때 동작하는 메소드 부분을 구현해 봅시다.
자세한 설명은 역시나 주석에 ^^*

추가적으로 설명하지 않은 것은 pow라는 녀석인데,
pow( x, y )라고 해주면 x의 y제곱을 구해주는 함수입니다. ㅎ

그리고 또! %.0lf,  %lf 등이 무슨말인지 잘 모르겠다 하시는 분들은 아래 포스팅을 참고하세요ㅎㅎ
 
2011/12/05 - [Objective-C] - Objective C <4>. 실수 표현 방법
2011/12/03 - [Objective-C] - Objective C <3>. 변수. Variable



자... 여기까지 작성하고 한 번 실행해 보세요~

화면에 숫자가 제대로 표시되나요?ㅎㅎ

아 물론 소수점이 찍히는 기능키는 코딩하지 않았기 때문에 동작을 하지 않지요 ^^ 

자, 오늘은 여기까지 해볼게요...ㅎㅎㅎ

신나지 않나요?

물론 전 지금 훈련소에서 뒹굴고 있겠죠...ㅋㅋㅋ

어차피 포스팅은 예약 되어 있으니까 다음에 또 뵙도록 해용 >_<



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 예외처리

마흔 아홉번째 시간입니다.^^

싱글턴 패턴에 대해서는 조금 익히셨나요?
그 외에도 디자인 패턴이란 것은 많이 존재합니다. 싱글턴 패턴은 아주 간단한 예에 지나지 않습니다.
디자인 패턴에 관심이 생기신다구요?
그렇다면 이제 아주 기초는 벗어나고 있다~ 라고 생각하시면 되겠습니다..ㅎㅎㅎ
물론 제가 말씀드리지 않은 것들은 정말 많지만, 저의 목표는 레퍼런스들을 나열하여 언제든 가져다 쓸 수 있는 것보다는 여러분들이 직접 원리를 알고, 개발문서를 통해 스스로 뭔가를 만들어 낼 수 있는 그런 포스팅이 되길 바라기 때문에 굳이 레퍼런스들을 다 나열하진 않았습니다.

많은 도움이 되셨는지 모르겠습니다. :)

이 기초 포스팅도 이제 막바지를 향해 달려가고 있습니다.
정말 몇 개 쓴거 같지도 않은데 이제 두어달만 있으면 일년이 되네요^^;
그동안 부족한 포스팅에 덧글도 응원도 많이 해 주신 여러분들께 진심으로 감사의 마음을 표합니다.

사설은 여기까지 하도록 하구요,

지난 포스팅에 이어 이번에도 iOS에 국한된 이야기라기 보다는 Objective-C 언어에서의 이야기를 해보려 합니다.
싱글턴도, 예외처리도 코코아 터치 프레임워크를 사용하는 것이라기 보다는 언어를 사용하는 테크닉 중 하나라고 볼 수 있겠지요.

오늘 포스팅은 정말 짧지만 정말 강력한 하나가 될 것이라 믿어 의심치 않습니다 ㅎㅎ

어쨌거나 저쨌거나 출발합니다~~~~~~~~~~


# @try @catch @finally

예외처리가 뭔가요???

여러분 여기까지 오면서 누구나 한 번 쯤은 Memory  Access Violation, Exception Error... 등등, 어플리케이션이 튕겨버리는 일을 겪지 않으신 분 없을겁니다.

즉, 어플리케이션이 죽어버리는... 만약 사용자가 사용하다가, 내가 사용하다가 퍽하고 강제종료 되어버리는... 이런 참사를 예방하려면 예외처리에 많은 심혈을 기울여야 하겠습니다. ㅎㅎㅎ

즉, 잘못된 처리로 인해 튕겨버릴 상황이 와도 한 번은 내가 컨트롤 해 볼 수 있는 여지를 만드는 것이 예외처리 입니다.

말로만 해서 잘 감이 안오시죠?

한 번 해봅시당 ㅎㅎ

지난 번에 사용하던 프로젝트에 그대로 적용해 보겠습니다.

싱글톤 객체에서 파일을 저장하던 메소드에 임의로 exception 에러를 발생시켜 봅니다.

NSDictionary는 Mutable이 아니기 때문에 setObject 메소드를 사용할 수 없지요. 그런데 임의로 Mutable인 것처럼 가장하여 메소드를 호출 해 봅니다.

말도 안되는 코드이긴 하지만, 실제로 종종 일어날 수 있는 일이기도 합니다. 이제 추가적으로 남은 것은 주석으로 모두 설명이 되어있습니다 ㅎㅎ

결과까지 한 화면에 나와있지요?



자, 이렇게 혹시 모를 상황에 대비하여 예외처리를 잘 사용해 주는것이 중요합니다.

이 하나의 포스팅으로 여러분의 어플리케이션이 조금 더 안정적이 되기를 희망합니다~

그럼 이만 뿅 ㅎㅎ



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. Singleton 패턴 사용해 보기


마흔 여덟 번째 시간입니다.^^

지난 번에 이어서 싱글턴 패턴 사용 방법에 대해 알아보도록해요 ㅎ

일단... 뭐... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
지금 여러분들이 이 포스팅을 보고계신 시간이면 저는 논산 훈련소에 있겠네요~ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아이 좋아.............는 개뿔......
면회 환영합니다..............는 개뿔.........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 오늘부터는 한달동안 제가 덧글을 달아드릴 수 없게되었군요...ㅠ_ㅠ

몸 건강히 돌아오겠습니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

한 달 캠프 으쌰~

자 잡소리 때려치고~

스따뚜~~~~~~~~~~~~


# 싱글톤 객체 활용

이제 싱글톤 객체를 사용하기 위해, 헤더를 import해 옵니다.

그리고 원래 있던 메소드는 깔쌈히 지워주시고 싱글톤 객체 안에 구현해놓은 녀석들을 사용하기 위해 예쁘게 작성합니다 호호호


불러오기도 마찬가지로 예쁘게 바꿔줍니다~


자, 그리고 파일로 읽고 쓰는 것 대신 싱글톤 객체에만 세팅하고 가져오는 기능도 따로 만들어주기 위하여 이렇게 또 버튼을 만들고 메소드를 만들어 줍니다~


자 이렇게 간단히 메소드 구현을 마쳐주시구요~~~~~~~



SecondViewController로 넘어와 봅니다~ 여기도 위와 똑같이 작성해 주시면 됩니당 ㅎㅎ



그리고 생각해보니 화면전환 기능을 안 넣어줬군요.....

훈련소의 압박으로 정신머리가 좀 나갔습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ViewController로 와서 화면전환을 위한 버튼을 만들어주고 연결 해 줍니다~ 



자, 그리고 이렇게 깔쌈하게 두줄로 완성~


그리고 다시 돌아올 방법도 만들어줘야겠죠?ㅋㅋㅋ
이렇게 연결해 줍니다. 


그리고 이렇게 한줄로 구현 끝~!


자, 실행 해 봅니다~
뭔가 되나용?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


어!? 그런데..... 아오....... 이놈의 키보드때문에 뭐가 안되는구만요...ㅠㅠㅠ


키보드놈을 없애봅시다~!

각각버튼을 누르고 나면 키보드를 사라지게 하는 마술을 심어줍니다 ㅎㅎㅎ 


그러고나서 이리저리 왔다갔다 하면서 어떻게 동작을 하는지 확인해 보세요~ 예상했던 것과 같은 동작들을 하는가 잘 살펴보세요 ㅎㅎㅎ



자... 이처럼 싱글턴 객체는 한 번 생성되면 메모리에 계속 상주하면서 데이터를 지니고 있게 됩니다.

어떤 곳에서도 그 한 객체를 불러내서 쓸 수 있는거죠~

재미있는녀석이죠?ㅎ 

 
잘 활용하면 득이되고, 잘못 활용하면 독이되는 녀석이기도 합니다.

뭐..... 제가 매번 이런말을 하는 것 같긴 하네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

자, 그럼 이만 뿅~!


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. Singleton Pattern 


마흔 일곱 번째 시간입니다.^^

지난 번에는 파일을 저장하고 로드하는 것을 해 보았습니다.
이번에는 파일에서 로드해 온 자료를 다른 객체들과 공유하여 사용하고 싶을때 사용해 볼만한 방법을 가지고 왔습니다~

물론 Objective-C에서만 쓰이는 방법이 아니지만, iOS 개발 할 때에도 유용하게 쓰일 수 있는 방법이라 이렇게 또 소개를 해 드립니다.
싱글톤 패턴이라고 흔히 이야기들을 하는데요, 무엇인지 한 번 알아보도록 합니다~


# 싱글톤 패턴이란?

한 프로그램에서 특정한 용도의 객체 하나를 생성해서 공용으로 사용하고 싶을 때 주로 사용하는 방법입니다.

주로 환경설정, 로그인 정보, 유저 정보 등을 한 번 객체에 생성해 두고 여러 객체에서 공유해서 데이터를 쓸 수 있는 방법이죠.

즉, 프로그램이 실행되고 끝날 때 까지 특정용도를 가지는 단 하나의 객체를 만들어 놓고 쓰게 되는 것입니다. 물론 임의로 해제해 주지 않는다면요 :)

말로만 이렇게 떠들어 대니 잘 감이 안오시죠?ㅎㅎㅎ

그런데 일단 static 이라는 녀석에 대해서 조금 알아보실 필요가 있습니다.

static이 어떤 녀석인지 정확히 알고 계신분은 바로 따라오셔도 좋습니다~

모르는 분들은 프로그래밍 언어 기본서에 보면 나와있을거구요, 포털 검색을 통해서도 많이 나올거예요^^~

자, 그럼 실습을 시작해 봅니다~
 

# 실습

지난 번에 만들었던 프로젝트를 그대로 사용합니다~

여러 객체간에 데이터를 공유하는 것을 실습해 볼 것이므로, 화면을 옮겨다녀 보는게 효과적일 것 같네요~

뷰 컨트롤러를 하나 더 만들어 줍니다 ㅎ


자, 그리고 이렇게 지난 번에 했던 것 처럼 새로운 뷰 컨트롤러에도 화면을 구성해 줍니다~



자, 이번엔 싱글톤 클래스를 생성하도록 할게요~




NSObject를 상속받는 SingletoneObject라고 이름을 지었어요. 사실 Singleton이 맞는 표현인데, 제가 자꾸 Singletone이라고 쓰네용 +_+


자, 이렇게 새로 생성된 클래스의 헤더에 와서요~

이런저런 것들을 작성합니다.

지난번에 파일에서 읽고 쓰기 했던 것들도 여기로 옮겨올 거구요, 공통적으로 쓰고 불러올 NSString 객체 포인터도 하나 만들어 줬구요~ 


자, 헤더에서 property로 던져줬으면 구현파일에서 synthesize로 받아주는거 잊지 않으셨죠?ㅎ

그리고 지난 번에 파일저장 메소드 구현했던 부분에서 복사해와서 붙여넣고 살짝 손봐줍니다 ㅎㅎㅎ


파일에서 불러오기도 마찬가지구요 :~)


자, 그리고 가장 핵심부분!!!

싱글턴 객체를 만들어주는 부분입니다.

static이라는 처음보는 녀석이 등장했죠? 주석으로 간략하게 설명을 써놓긴 했지만, 이해가 힘드시다면 검색을 해 보시는 것을 강력추천합니다 ^^; 



자, 이렇게 싱글톤 클래스까지 완성을 했습니다~

이제 이 녀석을 어떻게 사용하게될지 궁금하지 않으세용?ㅎㅎㅎ

제가 앞으로 어떻게 진행할지 감이 오는 분들도 분명 계실거 같아요 ㅎㅎ

음... 일단 오늘은 여기까지 쓸건데요 ㅎㅎ 한 번 써보고 싶은 분들은 마음껏 써보세요~

컴퓨터 폭발 안합니다~ 


으히히, 여튼 다음에 또 만나용~ :-)





by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 딕셔너리 형태의 객체를 파일로 쓰고 읽기


마흔 여섯 번째 시간입니다.^^

지난 두 포스팅에서는 모양새를 바꿔보는 것을 해 보았어요~
사실상 명목이었지 어쨌든 개념적인 요소가 많았지요 ㅎㅎㅎ

이번에는 파일을 읽고 써 보는 시간을 가져보도록해요 ㅎㅎ

매번 어플리케이션이 종료되면 모든것이 다 날아가 버리면 아쉽잖아요.
뭔가 저장하고 다시 가져올 수 있는 방법, 간단한 파일 쓰고 읽기를 해 보도록 합시다~

자, 그럼 시작해 볼까요?ㅎㅎ


# 파일 입출력

자, 우선 오늘도 프로젝트 하나를 만듭니다.

지난 두 프로젝트와는 달리 이 프로젝트는 3개 ~ 4개 포스팅 동안 사용하게 될 것 같네용 호호


늘 그래왔듯이 싱글 뷰 어플리케이션으로 만들어 줍니다 ㅎㅎ
 


이름은 YGFileManagement


첫 실행화면 ViewController.xib로 들어와서 이렇코롬 만들어 줍니다.
이제 이 정도는 설명하지 않아도 되리라 굳게 믿습니다 ㅋㅋㅋ 


딕셔너리 형태의 객체를 파일로 쓰고 읽는다고 했을 때 의아해 하신분들이 분명 계셨을 겁니다.

스쳐지나와서 생각 못하셨다구요?ㅎㅎㅎ

자, 우리는 파일을 plist형태로 쓰고 읽어주는 작업을 할거예요. plist...??? 어디서 들어본거 같은데???

그쵸?ㅋㅋㅋ Supporting Files에 AppName-info.plist라는 파일을 보실 수 있을거예요.

눌러보세용 ㅎㅎㅎ

그 안에 어떤식으로 구성이 되어있나요?

Key - Value 형식...!! 어!!!?? 딕셔너리네?

네~ 딕셔너리 형식으로 구성이 되어있는 것을 볼 수 있습니다.

그래서 우리는 딕셔너리를 plist로 저장하고 불러오는 것을 해 보도록 하겠습니다 ㅎㅎ


일단 저장하는 메소드를 먼저 작성해 보도록 하지요.

아까 버튼에 연결해 둔 메소드가 있지요? saveStringToFile 메소드를 정성스레 작성해 줍니다 ㅎㅎㅎ 

inputTextField에 입력해준 텍스트를 딕셔너리에 넣어서 파일로 저장하는거예요 ㅎㅎ

주로 간단한 내용들을 저장해 줄 때 Document 디렉토리 안에 저장해 줍니다. 어플리케이션 옵션을 주고 적절한 처리를 하면 iTunes에서 도큐먼트 폴더로 파일을 넣고 빼고 할 수 있는 곳이기도 하죠.

이제 이렇게 주석과 글들로 설명이 되어있는데, 이해가 안가거나 조금 더 알고싶은 메소드가 있다면 개발문서를 한 번 찾아보는 센스! 필요하겠죠?ㅎ 



자, 그리고 이번에는 파일에서 딕셔너리를 불러와서 outputLabel에 텍스트를 세팅 해 주는 메소드 입니다.


자, 그리고 실행! 우선 저장하기 전에 로드해 볼까요? 역시나 파일이 없으니 실패!!


하지만 저장하고,


다시 로드하면 이렇게 라벨에 로드가 되는군요 ㅎㅎㅎ


또 다른 글로 바꿔서 저장해보고~


다시 로드해도 잘 되네용 ㅎㅎㅎ


앱을 종료했다가 다시 실행해서 로드도 해 보세요~ 아주 잘 됩니다 ㅎㅎㅎ

물론 앱을 삭제했다가 다시 실행하면 도큐먼트 폴더 내의 데이터도 지워졌기 때문에 로드가 되지 않습니다. 


오늘은 이렇게 간단히 도큐먼트 폴더에 plist파일을 저장하고 불러오는 놀이를 해 보았습니다 ㅋㅋ

어떠셨나요? 괜찮았나요?ㅎ

물론 바이너리 데이터(예를들어 이미지 등)을 읽고 쓸 수 있는 방법도 있는데, 요청하시면 진행하도록 할게요 ㅎ

이런 간단한 예제 외에도 더 크고 복잡한 데이터들을 저장하고 불러오는 방법도 존재합니다.

역시나 배우면 배울수록 어려워지는..ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 오늘은 여기까지~


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 네비게이션 바 커스터마이징


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

지난 번에는 메소드 재정의(오버라이드)를 활용하여 UIAlertView를 커스터마이징 해 보았습니다~
어떠셨어요?ㅎ 이쁜 이미지로 커스터마이징 하니까 좀 더 산뜻해 지셨나요?ㅎ

오늘은 네비게이션 바를 커스터마이징 해 보겠습니다~

잘 응용하면 원하는 이미지나 이쁜 글도 넣을 수 있구요 :)

자 그럼 출발해 볼까요?ㅎ


# Navigation Bar Customize

자, 일단 새로운 프로젝트를 만들어 줍니다.

Single View Application이구요~


YagomCustomNaviBar라는 이름으로 만들어 주었습니다 ㅎ


그리고 우리는 커스터마이징을 할 때 이번에는 카테고리 라는 녀석을 이용할거예요~
어쨌든 일단 New File... 


Cocoa Touch - Objective-C category 라는 녀석을 선택~!


YGCustomNaviBar라고 이름짓고 Category on UINavigationBar를 작성해 줍니다~


그러면 UINavigationBar+YGCustomNaviBar 라는 희안한 이름을 가진 놈들이 뿅하고 튀어나옵니다~

카테고리로 사용하려면 클래스이름+내가 지정한 이름. 이딴식이지요?

오이잉???????? 고놈 요상하네~~~~~~

자, 그럼 여기서 카테고리란???????????

다른 언어에서는 쉽게 찾아볼 수 없는 형태로 Objective-C의 독특한 클래스 확장법이라고 생각하시면 되겠습니다.

지난번에 해보았던 오버라이드(재정의)보다는 약간 작은 개념입니다.

클래스를 상속받아 메소드를 오버라이드 하는 경우 원래 있던 메소드를 수정, 보완해 주는 형태였고, 인스턴스 변수 등등을 추가해 줄 수 있습니다.

하지만, 이 카테고리라는 녀석은 원래 클래스에다가 내가 원하는 메소드를 원래 그 클래스에서 갖고있던 녀석인 것처럼 추가해 줄 수 있는 간단하지만 강력하고 유용한 녀석입니다. 물론 메소드 오버라이드도 가능합니다. 다만, 클래스 변수 등은 선언해 줄 수 없습니다.

카테고리만 잘 이용해도 쓰임새는 무궁무진하죠 ㅎㅎㅎ

오늘은 네비게이션 바 커스터마이징으로 한 번 예를 들어 진행해 보고자 이렇게 포스팅을 하는 것입니다.

설명이 부족하다 싶으면 책이나 구글링을 통하여 찾아보셔도 좋습니다.

자, 그럼 이제 카테고리는 만들었고... 일단 네비게이션바를 보려면 네비게이션 컨트롤러가 좀 도와줘야겠죠?ㅎㅎ

AppDelegate에서 최상위 뷰 컨트롤러를 네비게이션 컨트롤러로 만들어 봅시다.
 


자, 한 번 실행해 보니 제대로 잘 된 것 같네요 ㅎㅎㅎ


그럼 이제 뷰 컨트롤러에 Push기능을 해 줄 버튼 하나를 만듭니다.

아직도 이 그림이 이해안가시는 분은 없으리라 믿습니다~!

오른쪽 버튼 드래그 또는 ctrl+드래그 아시죠?ㅎㅎㅎ 


그럼 이렇게 이쁘게 연결이 되겠죠???



자, 깔쌈하게 연결 해 줬으니 이제는 구현파일로 넘어와서 해야 할 일들을 말해줘야겠죠 ㅎㅎㅎ


그리고 실행하면 이렇게 이쁘게 버튼이 박혀있구요~



버튼을 누르면 이렇게 다음 화면으로도 넘어오네용 ㅎㅎㅎ


자, 우리가 구현하고자 하는 내용이 무엇이냐???

네비게이션 바 생김새를 커스터마이징 하는 것이지요~

특히나 저는 배경과 제목을 커스터마이징 하고 싶어요.

UINavigationBar 클래스 문서를 봅니다.

제목을 커스터마이징 할 꺼리는 안보이고...

그나마 배경이미지 설정해 주는 메소드가 있는것 같군요~


따라가 봅니다.

앗!!! 그런데 이게 왠 난관입니까??

iOS 5.0 부터 지원하는 메소드라고 합니다...

iOS 5.0 미만 사용자들은 어떡하지... 흠...  


자, 어쨌든 저쨌든간 방법은 있겠죠?ㅎㅎㅎ

버전을 체크해서 가능한 녀석들로 처리를 해 봅시다.

버전 체크하는 방법에 대한 자세한 내용은

2012/08/17 - [iOS Dev/깨알 Tips] - iOS Version Check

를 참고하시면 됩니다~

iOS 5.0 미만 같은 경우는 drawRect메소드를 오버라이드 하여 배경이미지를 그려줄 수 있습니다. 

물론 iOS 5.0이상이라면 좀 더 편안하고 안정적으로 구현되어있는 메소드를 이용해 주면 되겠죠?ㅎ

이렇게 카테고리 메소드를 완성해 줍니다. 물론 배경에 사용될 이미지도 잘 첨부 해 줍니다.ㅎ 


제가 사용한 이미지 올려놓을게요~



그리고 전에도 그랬다시피, 나 이런 메소드 가지고 있어~

오퐈 이런 능력자야~ 라고 말해주려면 헤더에 잘난척 해줘야겠죠?ㅎㅎㅎ


그리고 이제 이 카테고리 메소드를 사용하고 싶으면 헤더를 import해 주시고, 그냥 원래 클래스에 있던 메소드마냥 사용해 주시면 됩니다. ㅎㅎ


자, 이제 실행해 보면??? 예상했던 결과처럼 나오나요?ㅎㅎ


화면을 넘기면 이렇게 나오구요 ㅎㅎ


그런데 화면을 옮겨가도 위의 제목은 항상 그대로지요? 그래서 우리가 만들어 놓은 메소드를 통해 제목도 좀 바꿔줍니다. ㅎㅎㅎ

화면이 보이려고 할 때(viewWillAppear) 에서 해당 메소드를 사용해 주면 될 것 같군요 ㅎㅎ 

그리고 push해 준 후에 제목을 바꿔줘도 적용이 될 것 같은데요?ㅎㅎ 


짜잔~ 일단 첫번 째 화면에는 잘 세팅이 되었네요~


그리고 화면을 넘겼다가~~~~~~~~


다시 돌아와도 우리가 원한대로 잘 되어있죠?ㅎㅎㅎ



자, 오늘은 네비게이션 바 커스터마이징이라는 명목으로 카테고리 라는 녀석을 함께 해보았습니다.

어떠셨어요?

유용할 것 같지 않나요?ㅎ

물론 어떤 클래스라도 카테고리를 만들어 줄 수 있습니다.

자신이 자주 사용하는 기능이 조금 복잡하거나 매 번 프로젝트를 만들 때마다 구현해주기 귀찮다면 카테고리를 이용하는 것이 효율적일 것입니다.

자, 오늘도 즐거운 공부가 되셨길 바라면서

저는 이만 물러갑니다~

또봐용 ㅎㅎ


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 Tip

1. iOS Version Check


# iOS 버전체크하기

가끔 우리는 특정 버전에서 사용할 수 없는 메소드들을 만나게 됩니다.

그럼 지원하지 않는 버전의 기기에서 그 메소드를 호출하면 펑~ 하고 어플리케이션이 죽어버리는 사태가 발생하죠.

그래서 개발문서를 잘 보고 메소드를 사용하여야 합니다.

나도 모르는사이에 펑하고 어플리케이션이 죽어버릴 수 있으니까요 ㅎㅎㅎ

자, 그럼 버전체크하기~

주석에 달려있듯이 아래  메소드를 사용하여 내가 적어준 버전과 같은지, 그보다 아래인지 위에인지 판단 할 수 있습니다.


자주 필요하다면 아래처럼 App-Prefix.pch 내에 매크로로 정의하여 사용하여도 편리합니다~
 


 



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. UIAlertView Customize


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

정말 오랜만의 포스팅입니다~!

그동안 잘 지내셨나요?ㅎ
정말 무더위가 장난이 아니네용...
동남아 날씨 +_+

지난 번 공지로 iOS6와 스토리보드로 출발해 보겠다고 말씀드렸는데, 아직 제가 준비가 되지 못한 관계로 오늘도 iOS5로, 스토리보드 없이 진행합니다!

자, 그럼 다시 힘찬 출발을 해 볼까요?ㅎ


# UIAlertView 커스터마이징

전에 
2012/05/11 - [iOS Dev/함께해보기] - iOS개발하기 #29. 경고창 (UIAlertView)
포스팅에서 AlertView에 대해서 해 보았습니다.

이번엔 요 녀석을 커스터마이징 하는 방법을 살짝 이야기 해볼까 합니다.

물론 제가 오늘 소개해 드리는 방법 외에도 더 무궁무진한 방법이 있지만, 오늘은 간단한 선에서 진행 해 봅니다.

물론 여기에도 단순히 커스터마이징에 대한 정보가 아니라 부분 부분 지나쳐온 이야기들이 나올거예요..ㅎㅎㅎ

자, 그럼 새로운 프로젝트를 생성해 봅니다.

프로젝트 이름은 WithYagom이구요, ARC를 사용합니다~ SingleView Application으로 생성하였구요~


자, 프로젝트를 만들어 주고나면 ViewController가 있죠? 요녀석에 AlertView 하나를 만들어 띄워봅니다.


뾰뵹~ 우리가 하던대로 잘 나오죠?ㅎ


이제 커스터마이징을 위해서 우리가 새로운 클래스를 만들건데요, UIAlertView를 상속받는 클래스를 만드는 것입니다.

상속이 뭔가요?ㅋㅋㅋ

분명히 보신분도 보지 않으신 분들도 계실건데요, 이번 기회에 보고 옵시다~

2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)
2012/04/10 - [Objective-C] - Objective C <10>. 상속(2) - 오버라이딩

자, 그리고 조금 이따가 바로 오버라이딩을 해 줄거예요.

일단 클래스를 만들어 봅시다 ㅎㅎ

프로젝트 네비게이션에서 우클릭 또는 control +  클릭 해 주시구요~ 아니면 단축키 command + N 을 눌러주시면 됩니다~


Cocoa Touch - Objective-C class를 선택해 주시고~


CustomAlertView라는 이름으로 UIAlertView를 상속받은 클래스를 만들어 줍니다~!



자, 이렇게 UIAlertView를 상속받은 클래스가 생겼습니다.

이렇게 상속받은 클래스는 부모클래스인 UIAlertView의 메소드와 property를 모두 사용 할 수 있습니다.

게다가 오버라이딩을 한다던지, 우리가 새로 뭔가를 추가해 줄 수 있는 녀석이 되는거죠.


자, 우리가 원래 UIAlertView를 화면에 보여줄 때 사용한 메소드가 뭐였죠?

네! show!!!!!!!!!!

이녀석을 우리 입맛에 맞춰서 오버라이딩 해 줄거예요 ㅎㅎ

일단 [super show] 라는 곳에 주석을 안달았는데, super는 이 클래스의 부모클래스를 뜻합니다.

즉, [super show]는 부모클래스에서 show를 호출 해 주는 거예요. 우리가 show안에서 무슨 일을 처리하는지 모르니까 일단 불러줍니다.

그리고 그 후에 우리가 원하는 대로 입맛에 맞게 후보정을 해 줍니다 ㅎㅎㅎ

show 메소드를 오버라이딩 해 주는 것입니다. 

참, 그리고 소스에 보듯이 이미지들이 프로젝트에 들어와 있어야 합니다.

캡쳐한 것 보면 어느새 제가 이미지들을 낑궈 넣어논 것을 볼 수 있을거예요 ㅎㅎㅎ 


자, 그리고 이제 다시 ViewController로 돌아와서 우리가 만든 새로운 클래스의 인스턴스를 만들어주고 show를 호출해 봅니다.
참! 위에 헤더 import한 것을 네모박스 안했는데, 꼭 해주세요 ㅎㅎ 


두구두구두구둥!!!
우왘ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

요상하긴 하지만 어쨌든 바뀌었습니다 ㅋㅋㅋ

이미지는 새로 만들기 귀찮은 관계로, 그냥 있는 것 쓰는 걸로? ㅋㅋㅋ 물론 여러분들은 이쁜 이미지를 만들어서 넣어보세요 ㅎㅎ


자, 이렇게 오버라이딩을 통해 우리 입맛에 맞게 커스터마이징을 손쉽게 할 수 있습니다~!

그런데 저렇게 딱딱 고정해놓고 쓰기에는 뭔가 좀 아쉽죠?ㅎ

그래서 뭔가 다음에 쓰기 더 용이하도록 메소드를 이쁘게 만들어 줘 봅시다.

CustomAlertView.m으로 돌아와서 오버라이딩 했던 show가 아닌 우리가 필요한 녀석들을 인자로 받을 수 있도록 메소드를 조금 수정해 봅니다~ 


그리고 원래 없던 메소드를 우리가 추가했고, 다른 곳에서 호출해 주고 싶다면 헤더에 매소드의 원형을 꼭 써주셔야 합니다.

이렇게요~~~~~~~~ 꼭이요~~~~~~~~ 


그리고 나서 ViewController.m 으로 다시 돌아와서 요렇게 호출을 해 주면!!!!!!!!


똻!!!!!!!! 똑같이 동작합니다. 하지만 다음 번에 다른 이미지를 넣어주고 싶을때는 용이하게 이미지를 바꿔줄 수 있겠죠?ㅎㅎ


자, 처음에 우리는 오버라이딩을 통하여 직접 메소드를 건드려 줬구요,

두 번째로는 새로 메소드를 생성해 주어서 [super show]라는 메소드를 호출하여 show라는 메소드를 호출한 것과 동일한 결과를 만들어 냈고, 그 다음에 우리 입맛에 맞도록 커스터마이징 한 것입니다.

좀 헷갈리시나요?ㅎㅎ

여튼 차분히 잘 생각을 해 보시길 바랄게요.


이렇게 상속을 통하여 메소드를 오버라이드 하거나 원하는 메소드를 추가하여 전혀 다른 모습으로 커스터마이징을 할 수 있습니다.

물론 UIAlertView 뿐만 아니라 다른 클래스도 마찬가지겠지요?ㅎㅎㅎ

더 많은 기법과 더 많은 자료들은 구글님께 물어보시면 많을거예요 ㅎㅎ

사실 제가 커스터마이징보다 더 하고 싶었던 말이 오버라이딩이 아닌가 싶기도 하네요~

다음에도 유용한 녀석 하나 데려와 볼게요~

커밍 쑨~!

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom

Tip

ARC(Automatic Reference Counting) 프로젝트에서 특정파일 ARC 제외시키기


안녕하세요 야곰입니다.^^

팁이지만 간만에 포스팅이네요~_~

iOS5가 나온 이후로 ARC가 생겨서 많이들 좋아하셨는데, 다른 오픈소스나 라이브러리 등을 가져다 쓰려면 지난 소스들은 ARC 기준으로 작성되어 있지 않기 때문에 적용하기 난감했던 경우가 많으셨을 겁니다.

그런데 이런 방법으로 하면 간편히 지난 소스들을 다시 사용할 수 있습니다 ㅎㅎㅎ

# 본 포스팅은 iOS5.1, Xcode Version 4.3.3 (4E3002) 기준으로 작성되었음을 알려드립니다.

# ARC 제외시키기

일단 뭐 ARC 프로젝트가 필요한데 딱히 뭐 쓸만한 놈이 없으니 하나 만들어 봅니다 ㅎㅎㅎ
당연히 Use Automatic Reference Counting이 체크 되어있어야지 ARC 프로젝트가 되겠죠?ㅎㅎ


자, 저는 Reachability라는 녀석을 가져와서 빌드 해 보니 Fail이 되었네요~ (Reachability 라는 녀석은 Systemconfiguration.framework 프레임워크를 추가해 주셔야 합니다.)
붉은 악마들 천지입니다 ㅋㅋㅋ
소스를 보면 release, autorelease, NSAutoreleasePool 등 ARC에서 사용할 수 없는 녀석들 천지인 것을 볼 수 있습니다 ㅎㅎ 


자, 이따위 에러들을 뱉어내었군요...


그럼 이제 이렇게 하시면 됩니다~!
프로젝트를 선택하신 후 TARGETS - Build Phases를 선택, 그리고 ARC해제를 원하는 소스파일들을 선택합니다. 그리고 엔터!


그러면 요런 창이 뜨는데, 거기에 -fno-objc-arc 라고 입력해 줍니다. 그리고 Done..(다 완성됐다는 소리죠?ㅋㅋㅋㅋㅋㅋㅋㅋㅋ) 


자, 그리고서 빌드를 해보니까~!? 이렇게 깔끔~ 붉은악마들이여 안녕~





by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 Tip

1. 어플리케이션 실행 시 로딩 이미지 설정하기
2. 이미지 나타났다 없애기



어플리케이션 실행 했을 때 처음에 나오는 로고 이미지 등을 넣는 방법입니다.ㅎ


# 실행 시 로딩 이미지 넣기

정말 간단합니다.
Default.png 라고 이름을 만들어서 넣으면 알아서 찾습니다.. ^^;
물론 레티나 이미지는 뒤에 @2x 를 붙여주시면 되겠죠?ㅎ
주의할 점은 대소문자를 구분한다는 것입니다. 주의하세요~! ㅎ


그리고 좀 더 로고를 오래 보여주고 싶다면, AppDelegate로 와서 잠깐 정지 시킵니다..ㅎ

여기서는 1.5초를 중지시켜 봤어요~


# 나타났다 사라지는 애니메이션

이미지 뷰를 하나 선언해 주시구요~


애니메이션을 이렇게 만들어 줍니다...^^
이 코딩 기법은 블록코딩 기법입니다.
블록코딩 기법에 대한 상세한 내용은... 다음에 언제 한 번 다뤄보도록 하겠습니다^^;


실행 해 보세요~!

와우~ 판타스틱베이비~ㅋㅋㅋㅋㅋㅋㅋ


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

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. XML 파싱결과 테이블에 보여주기


마흔 두 번째 시간이자 XMLParsing 마지막 시간입니다.ㅎㅎ

지난 번까지 진행했던 내용들은 잘 되셨는지요?

이번에는 이제 XMLParsing을 마무리 해보려고 합니다.

자, 긴말 필요없이 떠나 봅시다 ㅎ


# NSNotification

지난 번에 '인절미후후' 님께서 블럭코딩 중에 데이터를 다른 메소드로 전달 하는 방법이 떠오르지 않아서 어려웠다고 말씀하셨는데요,

우리는 이미 배웠습니다..ㅎㅎ

객체간 데이터 전달에 관한 내용들 말예요~^^
2012/05/24 - [iOS Dev/함께해보기] - iOS개발하기 #33. Protocol, Delegate (프로토콜, 델리게이트)
2012/05/26 - [iOS Dev/함께해보기] - iOS개발하기 #34. NSNotificationCenter (노티피케이션센터)

우리는 그래서 이번에 노티피케이션을 이용해 볼까 합니다.

이 계기를 통해서 노티피케이션에 대해 조금 더 이해할 수 있으리라 생각해 봅니다. ㅎ

일단 우리가 가져온 자료들을 저장할 객체들이 있어야 겠지요?ㅎ

만들어 줍시다.


그리고 우리는 노티피케이션을 활용해 보기로 했으니 노티피케이션센터에 노티피케이션을 받겠다고 등록해 줍니다.
등록을 했으면 나중에 없애주는 것도 잊지 말아야겠죠?ㅎ

 
자, 그리고 이제 노티피케이션을 쏠 때 전달할 데이터 저장소를 만들어 줘야겠죠? 바로 딕셔너리를 사용합니다 ㅎ 
저장소를 만들고 노티피케이션을 숑숑숑 쏴줍니다 ㅎㅎ 


자, 그럼 이제 실질적으로 노티피케이션을 받았을 때 실행이 되어야 할 메소드들이 필요하겠죠?
만들어 줍니다~ㅎㅎ 


그리고 이제 가져온 정보를 바탕으로 테이블뷰에 가져와야겠죠?
위에 노티피케이션을 위해 구현한 메소드에서 테이블뷰의 데이터를 reload하고 있죠?
그렇게 하면 reload 할 때 마다 테이블뷰 데이터소스 메소드들을 다시 호출하게 됩니다.
데이터소스에서 테이블에 뿌려주기 위하여 코드를 또 작성합니다~



그리고 실행하면!!?

짜잔~!


네 얼럿도 정상적으로 뜨구요~
날씨정보도 가져오네요 ㅎㅎ 



자, 이미지뷰를 남겨놓은 이유는, 여러분께서 직접 날씨에 맞는 이미지를 넣어보라는 의미에서 하지 않았습니다.

제가 날씨 이미지 만드기 귀찮아서 그런거 아녜요... 네 그런거 아닙니다 ㅋㅋㅋ

XML데이터 내려온 것 중에 local  엘리먼트에 속성값 중 icon이라는 녀석이 있는데, 날씨에 따라 이녀석의 속성값이 다르죠?

이녀석을 이용해서 적절한 이미지를 넣는 것을 구상해 보세요 ㅎ

그럼 저는 여기까지~!

부족한 것 있으면 폭풍질문 주세요~^^*

뿅!

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 Tip

1. 현재 기기의 정보 가져오기 


# UIDevice

오늘은 현재 기기의 정보들을 가져오는 것에 대해 알아봅시다.

일단 버전별 호환성 때문에 버전체크를 가장 많이 사용을 할 텐데, 버전정보를 가져오는 메소드를 살펴봅시다.

우선 UIDevice라는 클래스가 있네요. 

레퍼런스를 살펴봅시다.


프로퍼티 중에 여러가지가 있는데, 이왕이면 한 번 다 같이 알아보도록 해요 ㅎㅎ


이런식으로 정보를 가져올 수 있습니다.
특히 기기 이름은 사용자가 지정해 놓은 기기명입니다.


그게 무슨뜻이냐구요?ㅎ

설정 - 일반 - 정보에 들어가면 나오는 이름을 뜻합니다.


버전을 체크할 때 이렇게 메소드들을 직접 만들어서 하기도 하구요,



미리 컴파일된 헤더(.pch) 파일에 #define으로 넣어서 구현하기도 한답니다.

예)

#define SYSTEM_VERSION_EQUAL_TO(version) ([[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch] == NSOrderedSame);

이런식으로요 ㅎ

pch가 뭐냐구요? 그건 구글신에게...ㅋㅋㅋ 

저도 추후에 기회가 된다면 포스팅 해겠지만, 일단은 구글에게 물어보아요 ㅎㅎㅎ

google 검색 링크


또한 위에 보여드렸던 레퍼런스에 보면 기기의 기울임 상태(세로 가로) 라던지 배터리 상태 등 기기의 많은 정보들을 가져올 수 있으니 한 번 활용해 보시길 ^^*


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


저작자 표시 비영리 변경 금지
신고
Posted by yagom


저작자 표시 비영리 변경 금지
신고

'yagom's life' 카테고리의 다른 글

iOS 6 siri의 반응들 :D  (2) 2012.06.14
iOS6 지도의 다케시마...  (4) 2012.06.14
맥과이어 휠 세정제  (7) 2011.12.06
정체불명 닭요리  (6) 2011.11.17
Posted by yagom
이번에 iOS 6 개발자 베타버전이 배포되었죠.

그래서 저도 설치해 보았습니다 ㅎㅎㅎ

한국어 siri 및 뭐 다양한 기능들이 있고, 페이스북도 들어가고...ㅎㅎ

오늘은 설치방법에 대해 한 번 알아봅니다~!

일단 애플 개발자 개정이 있어야 합니다. (무료 개발자 말고 $99 결제 한 개발자에 한함)

물론 설치하려고 하는 기기도 개발자 계정에 등록이 되어있어야 합니다.

http://developer.apple.com 에 방문하여

iOS Dev Center로 향합니다.ㅎ 

개발자 계정으로 로그인을 하면 아래와 같은 화면이 나옵니다.

iOS 6 SDK beta 탭에 들어가셔서 Downloads를 클릭!

 
일단 iTunes 10.6.3을 다운받습니다(기존의 아이튠즈를 업데이트 하셔도 됩니다.) 
그리고 자신의 기기에 맞는 iOS 6 beta 설치본을 받습니다.


다운로드가 완료되면 dmg형식으로 다운로드가 되어지는데요, 더블클릭하여 열어줍니다.


그럼 이렇게 장비에 잡힐거예요 ㅎ 그리고 이제 10.6.3 버전의 아이튠즈로 가 봅시다~


아이튠즈에서 기기 목록에서 일단 백업을 해 둡니다.
백업 안하시면 다 날아가요~~~~~~~~~!!


백업이 완료되면 아이튠즈에서 복원을 누르는데 OS별로 눌러야 하는 키가 다릅니다.
맥에서는 옵션+클릭, 윈도우에서는 쉬프트+클릭입니다.


그리고 우리가 받아두었던 그 ipsw파일을 선택 해 줍니다!


두구두구두구둑두구둑두구둑두굳구두굳구두굳구둑두구두구두구!
설치가 완료되면 아까 백업해 두었으니 백업에서 복원을 합니다.


복원이 완료되었다고 바로 연결을 해제하지 마세요!! 아래 사진처럼 복원 후에도 어플이나 데이터 설치를 위하여  계속 동기화 중입니다.

그러므로 동기화 완료가 될 때 까지 연결해제 하지 마세요~^^
물론 동기화 중에도 사용을 할 수는 있습니다~



저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. TBXML로 XML파싱


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

지난 번에 테이블을 준비해 두었었죠?
오늘은 XML 파싱을 한 번 해보려 합니다.
본래 코코아 내에 NSXMLParser 라는 XML파싱 클래스가 존재 합니다.
그래서 그녀석으로 포스팅을 해볼까 하다가, 그녀석 보다 좋은 녀석이 있어서 소개 겸 진행해 보려고 합니다.

사용법도 훨씬 간단하고 속도도 훨씬 빠릅니다~!
NSXMLParser는 처음 파싱해보는 분들은 정말 어려워 하는 경향이 있습니다.
그래서 준비했습니다. TBXML...!

오픈 라이브러리 가져다가 잘 쓰는 것도 중요합니다 ㅎㅎㅎ

저도 처음 써보는데, 일단 해 봅시다 ㅎㅎ


# XML의 구조


지난 번에 예제로 쓰겠다고 했던 날씨 XML 데이터 입니다.
XML은 요소(엘리먼트), 속성 등을 알면 됩니다.

1번 : 엘리먼트 입니다. 저 줄 하나가 통채로 엘리먼트 입니다. 맨 위에 루트 엘리먼트가 current라는 이름을 갖고 있네요. 그 자식 엘리먼트가 weather구요, weather의 자식 엘리먼트들이 local이란 이름으로 쭈욱 나열되어 있는 모습입니다.
2번 : 엘리먼트 이름 입니다.
3번 : 속성 이름입니다. 저렇게 엘리먼트 내부에 들어가 있는 녀석을 속성이라고 부릅니다.
4번 : 속성값 입니다.
5번 : 엘리먼트 텍스트 입니다.

일단 이렇게 기본적으로 알고 가 봅시다~!

# TBXML 다운받기

http://www.tbxml.co.uk

TBXML 공식 블로그입니다. 영국사람이 만들었나 보네요 ㅋㅋ 들어가 봅시다.
다운로드 링크를 타고 가서 소스파일을 다운받습니다.
지금 최신 버전이 1.5 버전이라서 추후에는 어떻게 변경될지 모르겠지만 여튼 아직까진 이렇습니다 ㅎㅎ


압축을 풀면 폴더들이랑 파일들이 나와요~
그중에 제가 여기 집어 넣은 녀석들을 골라서 가져옵니다.
그리고 우리 프로젝트의 pch파일로 옵니다. 거기서 하나 정의를 해 주시구요. (이녀석이 뭔가는 별로 신경쓰지 않으셔도 됩니다.) 


그리고 프로젝트 타겟 속성으로 와서 라이브러리 추가 버튼을 눌러줍니다.


libz.dylib를 추가해 주시구요


이제 테이블뷰 컨트롤러 구현파일에 와서 헤더파일을 임포트 합니다.
그리고 이쁘게 코딩~ 코딩~
TBXML은 블럭코딩 방식을 사용하였는데 iOS4.0 이상부터 지원합니다. 일단 아래 보이는 코드들이 좀 생소하더라도 블럭 코딩이라는 것만 알아두시고, 일단은 넘어갑니다 ㅎㅎ


또 또 코딩합니다~ 스레드 만드는 것은 설명 필요 없겠죵? +_+
2012/06/01 - [iOS Dev/함께해보기] - iOS개발하기 #36. UISearchDisplayController(2)
2012/06/06 - [iOS Dev/함께해보기] - iOS개발하기 #38. UISearchDisplayController(4)
요기서 스레드에 대해 좀 볼 수 있을 거에요~


자, 여기까지 모두 잘 되었다면 요로케 로그가 찍혀야 합니다~!
오홍홍~_~


잘 나왔나용?ㅎㅎ
오늘 테이블에 뿌리는 것까지 해 보려 했는데, 일단은 여기까지만 해야겠네용~

지난 번에 잘 따라오신 분들이라면 이미 테이블에 넣는 작업을 하고 계시지 않을까 싶네요 ㅎㅎ

그럼 다음 번에 또 뵙도록 해요 :-)

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



저작자 표시 비영리 변경 금지
신고
Posted by yagom


티스토리 툴바