Saturday, March 12, 2011

iphone 개발 수업 1주차

3/11
프레임워크라는 것은  package 와 같은 개념. 그러니까 클래스 묶음.
iOS 는 4개의 계층으로 구성되어 있는데 맨 위의 계층만 거의 object-c로 구성. 그렇기에 개발 자체는 꼭 object-c일 필요는 없으나 프레임워크를 사용하려면 object-c 필요
NSLog 나 NSString 클래스는 UTF-8 을  사용한다. 그렇기에 ""앞에 @를 붙여서 @"somthing" 방식으로 사용한다.


3/12
alloc 하면 클래스를 메모리에 올림, 단 super, self 는 초기화된다. self에는 자기 자신의 메모리 주소를 가르킨다.
init 을 호출해야 그 클래스의 속성들 (refCount, )이 초기화 된다.
nil = Nil = NULL = 0
nil : alloc 했는데 오류, 포인터가 더이상 객체를 가르키지 않는다.
Nil : 포인터가 클래스 메소드를 더이상 가르키지 않는다.
NULL : 객체를 가르키는 포인터가 아닌 변수, 구조체를 가르키는 포인터가 더이상 변수 구조체를 가르키지 않는다.
사실 구분하지 않고 사용해도 효과는 동일


objective-c 2.0 버젼에서는
클래스 안의 속성값은 다른 클래스에서 접근할 수 없기 때문에 속성을 리턴하거나 수정하는 메소드를 정의해야 했다. 그런데 3.0버젼부터는 property를 사용하면 컴파일러가 자동으로 속성과 관련된 메소드를 만들어 준다. 그리고 3.0 에서는 자동 구현된 메소드는 . 연산자에 의해 접근이 가능하다(원래는 [object setAttr] 식으로 해야 하는데 object.setAttr가 가능하다, 단 자동 구현 메소드만).


property
선언부, interface 에서는 @property 구현부, implementation 에서는 @synthesize를 명시해야한다. retain은 객체 타입, assign은
아.  set, get 메소드가 생긴다라고 보기보다는 C++처럼 그냥 . 연산자로 속성에 접근이 가능하게 하는 효과가 생긴다. 그렇기에 set메소드처럼 사용하려면 class.attr = something, get메소드처럼 사용하려면 NSLog(@"%@",class.attr) 과 같이 사용한다. 이는 사실 컴파일러가 set, get 메소드를 정의하면서 동시에 연산자(=) 오버로딩에 의해 가능해진 것이다.
@property (<#attribute#>) <#type#> <#name#>
<#attribute#> 에는 3종류가 있는데 setter(assign, retain), nonatomic(atomic, nonatomic), getter(readwrite, readonly) 가 있다.
<#attribute#> 안써주면 default로 atomic 으로 설정된다. atomic 은 한번에 하나의 쓰레드에서만 접근 가능한 객체. nonatomic 으로 설정해주면 여러쓰레드가 동시 접근이 가능한 객체. 대부분의 속성은 nonatomatic 이다.


아이폰 앱의 Architecture 와 life cycle
앱의 아이콘 터치 => main 실행 => UIApplicationMain 함수 실행(이는 cocoa내부에 구현되어 있는 것으로 그 메소드의 인자에 의해 저절로 project 이름이 넘어가면서 3번 스텝에서 UIApplicationDelegate 클래스를 상속받은 클래스가 무엇인지 판단하게 된다) : 1. 프로젝트명-info.plist(앱전체 설정파일) 을 읽고 2. plist  파일에서 main nib file base base name 키를 보고 화면설정이 있는 파일 이름을 찾음(MainWindow.nib; xml 파일) 3. UIApplicationDelegate를 상속받은 클래스의 객체를 생성([[someClass alloc] init])(UIApplicationDelegate 클래스를 상속받은 객체는 반드시 하나), 이때 2번에서 읽은 파일에 읽은 xml 파일에 있는 화면 객체들을 생성해서 someClass 안에 있는 UI window 객체 타입의 window 변수에 넣는다. UI window는 기본적으로 안보이게 되어 있다.  4. UIApplication 객체 생성 5.그리고 UIApplication 객체가 무한 루프를 돌면서 event가 발생하는지 monitoring 하고 event에 따라서 거기에 맞는 someClass, 즉 3에서 생성한 클래스의 메소드 호출. 무한 루프는 iphone3 에서 home  버튼 누르면 끝났으나 4버젼부터는 home 버튼을 눌러도 background 로 돌고 메모리가 OS 에서 메모리가 부족하면 그 때 끝낸다.


무작정 따라하기
1. Main