Retain Count - 객체의 참조수를 관리하여 alloc시 참조수 1 증가, 0이 되면 객체 메모리 해제 - retain, release 메시지 사용
Mac OS X 10.5 : Garbage collector - 프로그램 실행 중 동적으로 감시하고, 해당 영역에 있는 변수에서 접근 할 수 없는 객체 찾고 자동으로 메모리 해제 - 실행 타임에서 메모리 관리 - 문제점: 쓰레기 객체 탐색을 위해 CPU 소비 필요
Mac OS 10.7 : ARC - 코드를 컴파일 할 때 참조수를 컴파일러가 증가, 감소 관리
Strong Reference Cycle
두인스턴스가 서로강한(strong) 참조를하여메모리에서사라지지않는경우…
ARC는 Reference Cycle에자동적으로대응불가
‘weak’을이용하여방지
custom delegate를 weak로 attribute 하는이유
Retain Count
참조 종류 - Strong Reference: 객체가 다른 객체를 retain 하는 것. 기본 설정 - Weak Reference : retain하지 않는 것. 단순 포인터 대입 (참조 순환 피하기 위해) : Zeroing Weak Reference: ARC에서 약한 참조의 객체가 메모리 해제할 때 nil로 설정하여 메모리 crush 예방
dealloc - 참조 수가 1인 객체에 release 보내면 호출됨 - 마지막에 [super dealloc];
NSAutoreleasePool - 객체에 autorelease 메시지 -> Autorelase pool에 객체 추가 (가비지 컬렉터를 사용하지 않을 때) - Cocoa application: 모든 이벤트를 제어하기 전에 생성, 제어 후 해제 - 오토릴리즈 객체를 리턴하는 클래스 메서드들이 있음. ex) [NSString stringWithFormat: ….] - Release 시점: 보통 현재 이벤트 루프가 끝날 때
Retain - alloc, new, copy가 포함된 이름을 가진 메서드 (copy, mutableCopy ...) => 참조수 + 1 (atorelease pool x) - release 해야할 의무가 있음
Release - 소유를 원하지 않을 경우 release or autorelease - 0일 때 dealloc
접근자 메서드 - 다른 객체들이 인스턴스 변수를 접근하기 위해 사용 - getter, setter
UIApplicationMain 함수: 앱이 시작되면서 몇가지 중요한 객체 생성하고 앱 실행
UIApplication: 시스템과 앱의 여러 객체들간의 대화를 가능하게 해주는 객체
MVC 구조는 앱의 data와 비지니스 로직을 UI 요소로 분리해줌.
The Structure of an App
UIApplication 객체: Event loop 관리. Delegate에 앱 상태변화나 푸쉬알림같은 주요한 이벤트 알려줌.
App Delegate 객체: delegate. 이 객체는 UIApplication 객체와 함께 앱 초기화, 앱 상태변화 등 관리. 앱 하나당 하나만 존재
Document, data model 객체: data model은 앱의 콘텐츠 저장, 앱의 고유성을 가짐
View Controller 객체 - 내용을 화면에 나타내는 기능 (하나의 view와 subview들을 관리) - 화면에 view가 표시될 때 viewcontroller 객체는 뷰들을 앱의 window에 설치 - UIViewController : 모든 view controller의 부모 : View 로드하고, 보여주고, 디바이스 회전에 따라 돌려주는 등에 대한 기능 제공
UIWindow 객체 - 화면에 나타낼 뷰들을 다룸 (대부분 Main Screen에 해당하는 window하나만 가짐) - UIApplication 객체와 같이 작동하여 view controller와 view에게 이벤트 전달하는 역할
view 객체, control 객체, layer 객체 - 앱 컨텐츠 중 시각적인 부분 제공 - View: frame(지정된 사각형)의 공간에 내용물, 그 프레임 안의 이벤트에 응답하는 객체 - Control: 특정한 역할을 담당하는 view (Button, Text field, toggle, switch) - Layer: 시각적인 요소에 대한 Data 객체 (view는 screen의 뒷부분에서 이 layer객체를 사용하여 컨텐츠 내용을 나타냄. custom layer 객체를 사용하여 애니메이션을 줄 수 있음.)
The Main Run Loop
UIApplication 객체는 앱이 launch되는 시점에 메인 run loop를 생성한 뒤 이 run loop로 이벤트 처리
Main Thread에서 동작
사용자 관련 이벤트를 받은 순서대로 처리
사용자 액션 -> 액션에 대한 이벤트가 시스템에 의해 생성 -> UIKit에서 생성한 port 를 통해 앱에 전달 -> EventQueue에 저장된 순서대로 동작 실행 (UIApplication 객체가 이벤트를 받아서 어떤 동작을 취할지 결정) ex) touch event: main window 객체가 인식 -> window 객체가 다시 터치가 발생한 view로 이벤트 전달
이벤트 종류
Touch: View는 응답을 할 줄 아는 객체. 해당 뷰에서 처리되지 않는 터치 이벤트는 Responder chain에 다라 계속 내려감
- Control에서 발생한 터치 이벤트는 다른 view의 이벤트 전달 방식과 조금 다름. 그 이벤트들을 다시 action 메시지로 패키징하여 지정된 객체로 전달 => Target-action 디자인 패턴: 특정 액션이 작성한 코드로 연결되는 작업을 쉽게 해주는 패턴
Execution States for Apps
앱은 항상 아래 중 하나의 상태를 가지고, 시스템 내에서 일어나는 액션들을 통해 시스템은 앱의 상태를 바꿈
Not running: 실행되지 않음, 시스템에 의해 종료
Inactive: 앱이 foreground에 올라와 있지만 이벤트를 받지 않고 있는 상태 (보통의 앱은 다른 앱으로 전환할떄 잠시동안 이상태에 머물게된다.)
Active: 앱이 foreground에서 실행중이고 이벤트를 받고 있는 상태
Background: 앱이 background에 있고 코드를 실행하고 있는 상태. (맵이 직접 background로 실행될땐, Inactive상태가 아니라 바로 이상태로 머문다)
Suspended: 앱이 background에 있으면서 코드를 수행하고 있지 않는 상태. (시스템은 자동적으로 앱을 이상태로 바꾼다. 이상태일때는 메모리에 앱이 남지만 어떠한 코드도 실행되지않는다. 하지만 메모리가 부족하면 알림없이 메모리공간을 차지하기위해 이상태인 앱을 메모리에서 제거한다. 그래서 오랜시간 켜지않은 앱을 다시 불러오면 처음부터 시작되는 이유)
상태 변화는 AppDelegate 객체의 메소드 호출
- application:willFinishLaunchingWithOptions: 앱 최초 실행
-application:didFinishLaunchingWithOptions: 앱의 화면이 사용자에게 보여지기 직전 최종 초기화 작업
-applicationDidBecomeActive: 앱이 foreground로 전환
-applicationWillResignActive: 앱이 foreground에서 다른 상태로 전환
-applicationDidEnterBackground: background
-applicationWillEnterForeground: foreground
-applicationWillTerminate: 앱 종료
Thread and Concurrency
iOS의 Multi-thread 를 위해서는 Grand Central Dispatch, Operation Objects, 비동기 progrmaiing interfaces
View 관련 작업은 Main Thread
규모가 큰 작업은 GCD 또는 operation 객체를 통해 background thread에서 이루어지도록 하자.