아이폰 어플리케이션 개발이 많은 이슈가 되고 있고, 개발자들의 관심이 날로 증가하고 있습니다. 저희 아이렌소프트도 현재 아이폰 어플리케이션 개발에 착수하였습니다. 이에 아이폰 어플리케이션에 대한 공부를 시작하고 있는데, 이를 내부적으로만 사용하기 보다는 여러 개발자분들과 함께 토론하며 같이 성장하자는 의미에서 앞으로 공부하며 나오는 산출물들을 공개하기로 하였습니다. 첫번째로 애들에서 제공하는 문서인 iPhone Application Programming Guide 를 이용하여 공부하는 내용을 챕터벌로 올릴 예정입니다. 그리고 중간중간 저희가 먼저 삽질했던 부분을 정리하여 팁 & 태크 형식으로 올릴 것 입니다. 또한 기획인 관점에서 인기있는 아이폰 어플리케이션의 리뷰를 진행할 것이며, 아이폰에 대한 새로운 소식을 접하게 되면 그것들을 소개드릴 것 입니다. 아무쪼록 많은 개발자와 기획자 분들도 동참하시어 서로 정보를 공유하며 함께 많은 발전 이루기를 진심으로 기원해봅니다. 아이폰의 한국 출시가 거의 확정되어 있는 상황에서 아이폰 커뮤니티로 발전해 나가길 바랍니다. 먼저 아이폰의 Core에 대해 소개해 드리겠습니다.
The Core Application모든 아이폰 어플리케이션은 UIKit 프레임워크를 사용하여 만들어집니다. 그러므로 모든 아이폰 어플리케이션의 코어(Core)는 같은 구조를 가지고 있습니다. 이것은 대부분의 운영체제가 제공하는 방식이므로 크게 특별한 부분은 없습니다. 윈도우는 MFC나 Windows API를 제공한다는 것과 리눅스 또한 Linux API를 이용하여 프로그래밍 한다는 것과 같습니다.
Core Application Architecture
어플리케이션이 동작한 순간부터 끝날때까지 UIKit 프레임워크는 어플리케이션의 주요 구조의 대부분을 관리합니다. 아이폰 어플리케이션은 시스템으로 부터 계속 이벤트를 받아서 응답합니다. 이벤트를 받는것은 UIApplication 오브젝트의 역할입니다. 하지만 이벤트에 대한 응답은 사용자가 작성하는 코드에서 이루어집니다. 어디서 이벤트에 대한 응답을 할 것인지를 이해하기 위해서는 life cycle과 event cycle에 대한 이해가 필요합니다. 다음 챕터에서는 이 cycles와 아이폰 프로그램의 주요 디자인 패턴에 대해 설명합니다.
The Application Life Cycle
어플리케이션 life cycle은 시작과 종료 사이에 발생시키는 이벤트의 부분으로 구성됩니다. 어플리케이션이 시작 될 때 아이폰 어플리케이션도 main 함수로부터 시작되는데 이때 UIKit은 어클리케이션의 UI를 로드하고 이벤트를 받을 준비를 합니다. 프로그램이 동작하는 동안 UIKit은 이벤트를 사용자의 오브젝트에 전달하고 명령에 응답하는 역할을 수행합니다. 사용자가 프로그램을 종료시킬 때, UIKit은 어플리케이션에 종료 메시지를 전달하고, 프로세스의 종료를 시작하는 역할까지 수행하게 됩니다. 그림 1은 이러한 어플리케이션 라이프사이클을 도표화 한 것 입니다. 그림 1에서 보면 UIKit에서는 처음에 사용자의 탭으로 어플리케이션이 수행됩니다. 그때 appliationDidFinishLaunching를 통해 어플리케이션을 제어할 수 있습니다. 그 후 main()함수가 실행되고 UIApplicationMain 함수를 통해 이벤트를 받고 어플리케이션으로 전달하며, 어플리케이션은 Handle event를 통해 어플리케이션을 제어합니다. 어플리케이션이 정상적으로 동작하다가 사용자나 시스템이 어플리케이션 종료를 시도하면 applicationWillTerminate 메시지가 발생합니다. 사용자는 이 메시지를 받아서 종료시 처리해야 할 것을 수행 할 수 있습니다. 그 후 어플리케이션이 종료되는 것이 모든 아이폰 어플리케이션의 life cycle입니다.

그림 1. 어플리케이션 라이프 사이클
The Main Function
아아폰 어플리케이션에서 main 함수는 오직 굉장히 작은 일만을 수행합니다. 물론 아주 특별한 예외때 main 함수를 수정하여 사용할 수 있지만, 대부분의 어플리케이션의 main 함수는 코드 1과 같습니다.
#import <UIKit/UIKit.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
main 함수는 오직 세가지의 역할만을 수행합니다. 첫번째로 autorealese pool을 생성하고, UIApplicationMain함수를 호출합니다. 마지막으로 autorelease pool을 릴리즈하고 프로그램을 종료하게 됩니다.
Autorelease는 별도의 글을 통해 자세히 소개하기로 하고, 우선 UIApplicationMain 함수를 살펴보겠습니다. UIApplicationMain 함수는 네개의 인자(Parameters)를 받습니다.첫번째 두번째 인자인 argc, argv는 main 함수로 받는 것으로 쉘에서 프로그램을 실행 할 때 프로그램 실행 명령어와 함께 인자로 들어오는 값을 넣습니다. 그리고 세번째로 주요 클래스의 ID와, 네번째로 어플리케이션의 delegate 클래스를 넣습니다. 여기서 delegate 란 다른 클래스에 어플리케이션의 동작을 위임하기 위해 작성된 디자인 패턴으로, 프로토콜 규칙에 따라 구조를 맞추고, 필요한 메소드를 구현하면 그 클래스가 알아서 동작하게 되는 디자인 패턴을 말합니다. UIApplicationMain의 세번째 네번째 인자에 nil 을 넣으면 UIKit 은 UIApplication 클래스를 기본으로 사용하여, 네번째 인자에 nil을 넣으면 UIKit은 어플리케이션 delegate 가 nib 파일을 통해 로딩 될 것이라고 가정합니다.
The Application Delegate
사용자 레벨(High level)에서의 행동을 모니터링 하는 것은 개발자가 제공하는 delegate 오브젝트의 역할입니다. Delegation(위임) 방식은 UIKit 을 subclassing 하는 복잡함을 방지하는 매우 좋은 디자인 패턴입니다.
The Main Nib File
어플리케이션이 로딩될 때 수행하는 또다른 일 중 하나는 어플리케이션의 nib 파일을 로딩하는 것 입니다. 만약 어플리케이션의 Info.plist 파일이 NSMainNibFile key를 가지고 있다면 UIApplication은 nib 파일이 정의하는 것을 로드 합니다. main nib 파일은 자동으로 로드되는 한 하나의 nib 파일 입니다. 그러나 필요할 때 nib 파일을 사용자가 집접 로드할 수는 있습니다. Nib 파일은 디스크에 저장되는 하나 이상의 오브젝트의 스냅샷이 저장되어 있는 리소스(resource) 파일입니다. Main nib 파일은 일반적으로 window 오브젝트와 delegate 오브젝트가 포함되어 있습니다. 그리고 하나 이상의 윈도우를 제어 하기 위한 key 오브젝트로 구성되어 있습니다. nib 파일을 로딩하면 실제 메모리에 이 오브젝트를 재 구성하여 사용 가능한 상태로 만듭니다. 이것은 UIApplicatonMain에서 로딩하는 것과 동작 상 다른 점이 없습니다.
The Event-Handling Cycle
UIApplicationMain 함수가 초기화 된 후에, 어플리케이션의 이벤트 관리와 그림 그리기를 시작합니다. 이것은 그림 2에 묘사되어 있습니다.

그림 2. 이벤트와 그리기 주기
그림 2는 보면, 운영체제(Operating system)은 사용자의 터치를 감지하여 Event queue에 넣고, Event queu는 어플리케이션에 이벤트를 전달합니다. 어플리케이션 내부에서는 이벤트를 사용해야 하는 오브젝트에 이를 전달합니다. 동작이 완료되면 다시 운영체제로 결과를 돌려주고, 운영체제는 이를 화면에 표현합니다.
아이폰 어플리케이션에서는 멀티 터치 이벤트를 지원합니다. 하지만 멀티 터치가 여러개의 이벤트를 생성하는 것이 아닌, UIEvent라는 하나의 이벤트에 캡슐화 되어 들어가 있습니다. 터치에 관련된 이벤트는 UIEvent에 UITouch 오브젝트를 포함하여 전달하게 됩니다.
어플리케이션이 실행되면, 시스템은 어플리케이션을 위해 프로세스와 하나의 쓰레드를 생성합니다. 생성된 쓰레드는 어플리케이션의 메인 쓰레드가 되고, 이것은 UIApplicaton이 mian run loop 에서 동작합니다. 그림 3은 main run loop 와 이벤트 제어의 관계를 나타냅니다.

그림 3. Main run loop
UIApplication 오브젝트는 입력되는 터치 이벤트를 적당한 responder 오브젝트로 분기하여 mian run loop를 설정합니다. responder 오브젝트는 UIResponder 를 상속받아 만들어지며, UIApplication, UIWindow, UIView, 그리고 모든 UIView의 서브 클래스의 인스턴스를 포함합니다.
추가로, UIResponder 클래스는 responder chain 을 가지고 있습니다. 이것은 만들어지는 이벤트가 링크로 연결되어 전달되며, 첫번째 responder가 이벤트를 처리하지 못하면, 두번째 responder 에 전달되고, 이렇게 끝까지 전달되면서 처리하는 구조입니다.
Fundamental Design Patterns
디자인 패턴에 대한 부분은 별도의 팁 & 태크에서 소개해 드리도록 하겠습니다.
The Application Runtime Environment
Fase Launch, Short Use
아이폰은 동시에 하나의 어플리케이션만 실행할 수 있습니다. 이것은 어플리케이션을 실행하기 위해서는 항상 홈 스크린에서 어플리케이션 아이콘을 클릭하여 실행해야 한다는 것을 의미합니다. 아이폰 어플리케이션은 빠르게 실행되고 빠르게 종료되어야 합니다. 만약 5초 이내로 어플리케이션이 종료되지 않으면 시스템이 이것을 강제로 종료합니다.
아이폰 어플리케이션은 백그라운드에서 동작하지 않기 때문에, 종료시 최종 데이터를 저장해야 다시 실행 했을 때 마지막으로 동작하던 모습을 재현해 낼 수 있습니다.
The Application Sandbox
아이폰 어플리케이션은 보안상의 이유로 파일시스템의 지정된 곳에만 위치할수 있다. 이것은 sandbox라는 보안 기능의 부분 기능입니다. sandbox 라는것은 보안 분야에서 사용되는 언어로, 모든 실행과 데이터를 시스템이 알 수 있는 범위에서 동작하도록 하고 어플리케이션의 모든 행위를 모니터링 할 수 있게 하는 개념입니다. 이것을 위해 아이폰 어플리케이션은 다음의 위치에서만 실행 될 수 있습니다.
/ApplicationRoot/Application ID/
하지만 아무리 sandbox로 동작한다고 해도 어필리케이션의 오버플로우나 기타 해킹 방법으로부터 자유로울 수는 없다는 것을 명심 하시기 바랍니다.
The Virtual Memory System
어플리케이션 메모리를 관리하기 위해 아이폰 OS는 Mac OS와 같은 virtual memory 시스템을 사용합니다. 다만 아이폰에서는 메모리가 부족할 때 디스크에 메모리 페이지를 쓰는 swap 기능을 사용하지 않습니다. 이는 빠른 동작을 위한 조치라고 판단됩니다. 대신 아이폰 OS는 현재 메모리에서 사용하지 않는 메모리의 코드 영역 같은 부분을 내려서 공간을 확보하며, 그래도 메모리가 부족하면 동작하고 있는 어플리케이션에 현재 필요없는 메모리를 해지하라는 메시지를 보냅니다. 어플리케이션은 이 메시지에 응답하여 cache나 불필요한 메모리를 해지할 의무가 있습니다.
The Automatic Sleep Timer
아이폰 OS에서는 베터리를 절약하기 위한 방법으로 자동 sleep timer 를 사용합니다. 사용자가 일정 시간동안 아이폰을 터치하지 않아서 이벤트가 발생되지 않는다면 아이폰 OS에서는 자동으로 시스템을 정지시키고 스크린을 끕니다. 하지만 게임이나 동영상 플레이어 같은 어플리케이션은 사용자 입력 없이도 오랜 시간 동작해야 할 수 있기 때문에 UIApplication 오브젝트의 idleTimerDisabled 속성을 YES로 만들어서 자동 slee timer를 끌 수 있습니다.
The Application Bundle
아이폰 어플리케이션을 빌드할 때, XCode는 Bundle과 함께 패키지 합니다. Bundle은 하나의 그룹화 되어 있는 하나의 디렉토리 입니다. 번들은 아래 내용과 같이 어플리케이션 아이콘, 프로그램 실행 파일 등 여러가지로 구성됩니다.
MyApp - 실행 파일.Settings.bundle - 프로그램의 속성과 다른 리소스 파일에 대한 내용을 포함
Icon.png - 57 x 57 사이즈의 홈 스크린에서 보여지는 어플리케이션 아이콘
Icon-Settings.png - 29 x 29 사이즈의 어플리케이션이 동작할 때 어플리케이션 이름 옆에 나오는 아이콘
MainWindow.nib - 어플리케이션의 main nib 파일입니다. 이것은 어플리케이션의 main 윈도우 오브젝트와 delegate object 를 포함하고 있습니다. 다른 interface 오브젝트는 추가적인 nib 파일로 부터 로드하거나 소스 레벨에서 포함합니다. Info.plist 파일의 NSMainNibFile key 를 변경하여 이 파일 이름을 변경할 수 있습니다.
Default.png - 480 x 320 사이즈의 이미지로, 어플리케이션이 시작할 때 보이는 이미지 압니다.
iTunesArtwork - 512 x 512 사이즈의 이미지로, 어플리케이션을 배포할 때 보여지는 이미지 입니다. 이것은 appstore에 배포될 때 보여지게 됩니다.
Info.plist - 어플리케이션의 bundle ID, 버전 그리고 보여지는 어플리케이션 이름 등 어플리케이션의 주요 속성이 들어있습니다.
sun.png - 해당 언어가 지원되지 않을 때 보여지는 이미지입니다.
en.lproj, fr.lproj, es.lproj ... - 지원 언어 리소스 입니다.
The Information Property List
Info.plist 파일은 모든 아이폰 어플리케이션이 포함하고 있는 속성 파일입니다. 이것은 XCode의 Active Target TargetName 메뉴를 클릭하여 GUI로 수정할 수 있습니다.(그림 4)

그림 4. Active Target
여기서는 기본적인 이름등을 수정할 수 있고, 더 자세한 설정은 하단에 있는 Open Info.plist as File을 클릭하면 그림 5와 같은 화면이 실행되고 여기서 모든 속성을 수정할 수 있습니다.

그림 5. Info.plist 파일
Handling Critical Application Tasks이 장에서는 어플리케이션이 꼭 수행해야 할 역할을 기술합니다.
Initialization and Termination
어플리케이션이 초기화되고 종료되는 동안 UIApplication 클래스는 해당 메시지를 전송합니다. 어플리케이션은 delegation 오브젝트에서 이것을 처리해야 합니다. 초기화와 종료를 처리하는것은 필수 사항은 아니지만, 어플리케이션의 초기화때 데이터를 초기화 하거나 종료할 때 데이터를 저장하는 등의 역할을 수행하기 때문에 대부분의 어플리케이션에서는 이 메시지를 이용해야 할 것입니다. 아이폰 어플리케이션은 시작과 종료가 빠르고 가볍게 처리되야 하기 때문에 이 메시지를 적절히 이용해야 하는데, 만약 어플리케이션이 네트워크로부터 데이터를 받아오거나 복잡한 연산을 하여 초기화가 느릴 때, 먼저 UI를 보여주고 그 후에 초기화를 처리하는 방법 등으로 작업을 해야 합니다.
다음 글 박스에서는 UIApplicationDelegate에서 초기화와 종료시에 사용하는 메소드 프로토콜을 설명합니다.
applicationDidFinishLaunching - 어플리케이션이 시작 될 때 실행되는 메소드 입니다.
applicationWillTerminate - 데이터를 저장하거나 어플리케이션의 상태를 저장합니다. 어플리케이션 종료 시 호출됩니다.
Responding to Interruptions
사용자가 홈 버튼을 클릭하여 프로그램을 종료시키는 것 이외에도, 시스템이 어플리케이션에 interrupt를 걸어서 사용자의 입력을 기다릴 수 있습니다. 예를 들어 전화가 오거나 SMS가 오는 경우에 사용자에게 다음 수행을 물어보고 전화를 받는다면 어플리케이션은 종료되게 됩니다. 그림 6은 이러한 동작을 표현합니다.

6. Interrption
1. 시스템이 전화나 SMS가 전송되거나 달력에서 이벤트가 발생하는 것을 탐지합니다.
2. Deligate의 applicationWillResignAcive를 호출합니다.
3. 시스템이 alert 패널을 띄워서 사용자에게 전화나 SMS 수신 등의, 해당 이벤트를 알립니다.
4. 만약 사용자가 해당 이벤트를 무시하면 applicationDidBecomeActive 를 호출합니다.
5. 사용자가 해당 이벤트의 수행을 지시하면 applicationWillTerminate 를 호출합니다. 이때 어플리케이션은 종료시와 마찬가지로 데이터나 어플리케이션 속성을 저장해야 할 것입니다.
아이폰 OS가 sleep 모드로 들어가거나 다시 깨어날 때도 applicationWillResignAcive와 applicationDidBecomeActive가 호출됩니다.
Observing Low-Memory Warnings
시스템이 low-memory notification을 어플리케이션에 전달하면 어플리케이션은 빠르게 필요없는 메모리를 해지해야 합니다. 이 notification을 알 수 있는 방법은 3가지가 있습니다.
- applicationDidReceiveMeoryWarning 을 delegate에 구현합니다.
- UIViewController의 didReceiveMeoryWarning 을 override 합니다.
- UIApplicationDidReceiveMemoryWarningNotification 메시지를 등록하여 처리합니다.
Customizing Your Application's Behavior이 장에서는 사용자의 경험에 기반하여 어플리케이션을 최적화 하는 방법을 제시합니다.
Launching in Landscape Mode아이폰 어플리케이션은 기본적으로 potrait mode(세로)로 동작한다. 만약 portrait mode와 landscape mode 둘다 지원한다면 portrait mode 로 시작하는 것이 좋다. 만약 landscape 모드로만 동작하게 하려면 다음의 과정을 거쳐야 한다.
- Info.plist 파일에 UIInterfaceOrientation 키를 추가하고, 여기에 landscape mode 를 세팅한다UIInterfaceOrientationLandscapeLeft(홈 버튼이 왼쪽 기준)또는 UIInterfaceOrientationLandscapeRight (홈 버튼이 오른쪽 기준) 속성 중 하나로 선택하면 된다.
- 어플리케이션 UI를 landscape 모드에 맞게 만든다.
- shouldAutorotateToInterfaceOrientation 을 landscape 모드에서는 YES를 리턴하게 하고, POTRAIT 모드에서는 NO를 리턴하게 한다.
Communicating with Other Applications만약 어플리케이션이 시스템에 등록된 종류의 URL을 호출하면 시스템은 해당 URL에 해당하는 어플리케이션을 동작시킨다. 예를 들어 Map을 보여주는 URL을 실행하면 등록된 Google map 이 실행되는 것이다. 이것을 통해 어플리케이션간 통신을 수행 할 수 있습니다. 애플에서는 http(사파리), mailto(애플 기본 메일 클라이언트), tel, sms의 URL 기능을 기본적으로 제공합니다. 이 기능을 사용하기 위해서는 NSURL 오브젝트를 생성하여 UIApplication 오브젝트의 openURL 메소드를 사용하면 됩니다. 이를 통해 다른 어플리케이션이 실행되면 기존의 어플리케이션이 잠시 종료되고, 새롭게 실행된 어플리케이션이 종료되면 다시 자동으로 실행되게 됩니다.
다음은 다른 어플레이케이션에 데이터를 전송하는 예제 코드입니다.
NSURL *myURL = [NSURL
URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];
위 코드를 보면 todolist 로 시작하는 URL을 사용하는 것을 볼 수 있는데, 이것은 아이폰 OS에 등록된 어플리케이션이 실행되면서 뒤의 URL을 전달하게 되는 것 입니다.
Implementing Custom URL Schemes애플에서 기본적으로 세팅한 URL type은 변경할 수 없지만, 그 외의 URL type은 개발자가 별도로 등록할 수 있다. 이것을 수행하기 위해서는 Info.plist 파일에 CFBundleURLTypes 속성을 통해 등록합니다. 다음 글 박스는 이 속성의 값을 설명합니다.
CFBundleURLName - URL Type의 이름입니다. 이것은 어플리케이션별로 unique 해야 하기 때문에 DNS 를 거꾸로 표현한것 과 같은 com.acme.myscheme과 같은 방식을 사용하기를 권장합니다.
CFBundleURLSchemes - URL의 앞부분에 들어가는 이름을 문자열로 입력하며, 여러개를 사용할 수 있습니다. 예를 들어 todolist, dolist 등과 같이 등록하면 이 형식의 URL이 로드되면 해당 어플리케이션이 동작합니다.
이 기능을 테스트 하기 위해서는 safari를 사용하면 됩니다.
Handling URL Requests다른 어플리케이션이 URL request를 통해 해당 어플리케이션을 동작시켰다면 이것은 delegate의 APPLICATION:handleOpenURL 메소드를 구현하여 처리할 수 있습니다. 이 메소드를 통해 입력되는 NSURL을 처리하여 동작시키면 됩니다.
Displaying Application Preferences사용자가 바꾸는 설정이 바로 적용되거나 무엇인가 동작이 바뀌기를 기대하는 것은 어플리케이션 내부에 넣고, 그렇지 않은 것은 시스템의 설정에 넣으면 됩니다. 시스템에 넣는것은 Settings.bundle에 포함시켜서 설정할 수 있으며 Icon-Settings.png를 Bundle에 넣으면 시스템 설정창에 해당 아이콘이 보여지게 되며, 제공하지 않으면 기본적으로 어플리케이션 아이콘이 등록됩니다.
Internationalizing Your Application텍스트, 이미지 등 모든 리소스는 사용하는 아이폰의 언어에 따라 다르게 보여지게 할 수 있습니다. 시스템에서 기본적으로 제공되는 alert나 기타 컨트롤들은 기본적으로 이 기능을 가지고 있습니다. 일반 어플리케이션에서 이 기능을 사용하려면 pInfo.list 에서 설정하여 사용할 수 있습니다. pInfo.list에서 lproj 폴더를 지정하여 해당 폴더에 코드가 생성하는 텍스트, 기본 텍스트, 아이콘, 사운드 파일, Nib 파일등을 넣을 수 있습니다.
lproj의 서브 디렉토리는 다음과 같습니다.
en.lproj/
- InfoPlist.strings / - 이 디렉토리에는 각 국가별 언어 디렉토리를 하위 디렉토리로 가지고 있습니다. 예를 들어 프랑스 언어는 fr.lproj 디렉토리를 통해 지원할 수 있습니다.
- Localizable.strings / - 어플리케이션이 생성하는 스트링이 포함됩니다.
- sign.png / - 국가별로 구분되는 이미지
NSLocalizedString 매크로를 이용하여 코드상에서 언어를 구분하여 지원할 수 있습니다.
NSString *NSLocalizedString(NSString *key, NSString *comment);
label.text = NSLocalizedString(@"City", @"Label for City text field");
NSLocalizedString은 key와 comment로 구성되어 있습니다. key는 언어를 말하며, 이것을 번역하기 위해 필요한 커맨드를 넣을 수 있습니다. 그 후 lproj 폴더에 다음과 같은 키를 Localizable.strings 파일에 넣으면 해당 언어로 번역됩니다.
"City" = "Ville";
다국어 지원에 대한 것은 더 자세히 팁 & 태크에서 소개해 드리겠습니다.
Tuning for Performance and Responsiveness
Using Memory Efficiently메모리를 효과적으로 사용하기 위해서는 다음과 같은 사항을 지키시기를 권장합니다.
- 메모리 릭을 최소화 해라
- 리소스 파일을 최대한 작게 사용해라
- 큰 데이터는 SQLite 를 이용하여 저장하고 불러와라.
- 리소스는 필요할때만 불러와라.
- Thumb 를 이용하여 컴파일하면 35%의 메모리가 절감된다. 하지만 그만큼 퍼포먼스는 떨어진다.
Allocating Memory Wisely메모리를 할당할 때는 다음과 같은 사항을 지키시기를 권장합니다.
- Autorelease 사용을 최대한 줄이고, 개발자가 직접 allocating 하고 release 해라.
- 리소스를 줄여라.
- 문제가 되는 메모리 사용을 회피해라.
Reducing Power Consumption다음 기능의 사용의 최소화 하여야 베터리를 오래 쓸 수 있습니다.
- Wi-fi radio
- baseband cell radios
- Core location framework (GPS)
- Accelerometers (가속도 센서)
- Disk
이로서 첫번째 챕터의 소개가 끝났습니다. 지금은 문서를 번역하고, 그에 따른 약간의 양념을 가미한 수준입니다. 하지만 앞으로 팁&태크나 새로운 강좌들을 통해 더욱 많은 소개 드리도록 하겠습니다. 아직까지 애플에서 제공되는 문서를 통해 포스팅을 하는 것은, 원문과 다르게 더 좋은 글을 쓰려고 하는것은 거의 불가능 하므로, 원문에 충실하게 계속 포스팅 하겠습니다.
Leave your greetings.
find cheap <a href="http://www.echeapraybansunglasses.com/"><strong>ray ban aviator</strong></a> products on the <a href="http://www.echeapraybansunglasses.com/"><strong>ray ban sunglasses</strong></a> store, then you can see the fashion <a href="http://www.echeapraybansunglasses.com/"><strong>aviator sunglasses</strong></a>, enjor to buy <a href="http://www.echeapraybansunglasses.com/"><strong>raybands</strong></a> gooo.
2011/10/20 11:43 [ Permalink : Modify/Delete : Reply ]