Friday, March 18, 2011

iphone 개발 수업 2주차

3/18
그 전체 화면의 기본이 되는 객체는 UIWindow 이고 이는 UIApplication 객체가 MainWindow.xib 를 읽어서 생성한다.


IBOutlet [변수] : UIApplication 이 MainWindow.xib 이름의 xml을 가지고 객체 생성하는데 이 때 만든 객체의 주소를 다음 [변수]에 대입하기 위해서 사용. 
그 뒤에 그 [변수] 를 가지고 그 객체의 속성을 바꿀 수 있다. [변수].text = @"메시지" 처럼


UIResponder : 화면 관련 객체들에 어떤 이벤트가 발생 하는가를 계속 모니터링 하는 객체, 이는 UIApplication안에 속성으로 있어서 UIApplication이 생성될 때 생긴다.


IBAction 은 이벤트 함수를 선언할 때 쓰이는 것으로 UIReponder에게 UIWindow 의 특정 객체에 특정 이벤트가 생기면 그 이벤트 함수를 호출해 달라고 명시 하는것 


UIResponder에 의해 특정 이벤트가 발생하는 것이 모니터링 되고 IBAction이 명시된 이벤트 함수에 맞는 이벤트가 발생하면 그 이벤트 함수를 호출한다. 호출된 이벤트 함수의  return type 이 void 이다.


UIResponder가 이벤트 함수를 호출할때 매개변수인 sender 에는 이벤트가 발생한 객체의 주소가 들어간다.
-----------------------------------------------------------------------------------------


아이폰에서는 폴더를 번들이라는 용어로 사용한다.


개발할때는  classes, Resources등으로 소스들이 나뉘는데 사실은 하나의 번들 안에 들어가 있는 것이다.


개발한 어플을 아이폰에 설치하면 설치자마다 그 어플의 위치(경로)가 다를수 있는데 경로를 알고 싶을때 사용하는 클래스가 NSBundle과 CFBundleRef 가 있다. CFBundleRef 는 NSBundle과 같은 역할을 하나 C 로 구성되어 있어서 내부가 불분명한 불투과형의 함수이다.


NSBundle : 현재 어플의 실행 경로 정보, 어플이 있는 번들에 존재하는 파일, resource를 찾아서 경로를 리턴.
[NSBundle mainBundle] : 현재 자신 어플의 정보(자신의 현재 경로와 그안의 파일과 리소스의 경로) 가지고 있는 객체를 리턴한다. 
[[NSBundle mainBundle] pathForResource:@"candle on" ofType:@"jpg"] : NSBundle 클래스의 mainBundle 메소드를 호출해서 NSBundle 객체를 생성하고 candle on 이라는 파일명과 jpg 라는 확장자를 가지는 경로를 리턴한다.


UIImage : 메모리로 이미지 출력(아이폰은 우선 이미지를 메모리로 로딩해서 로딩이 끝나면 화면에 출력. 로딩될 때 버벅대는 과정을 화면에 나타나지 않게 한다)
[[UIImage alloc] iniWithContentOfFile:candleOnPath] : candleOnPath 변수에 들어 있는 경로의 파일을 메모리레 출력


 object-c 는 항상 객체의 주소만 가져올수 있다.
---------------------------------------------------------------------------------------------


3/19
<쓰레드>
어플리케이션 그러니까 하나의 프로세스를 구성하는 기능 하나하나를 쓰레드라고 한다. object-c에서는 메소드 하나를 쓰레드 하나라고 생각한다.
 NSOperationQueue : 메서드들을 멀티쓰레드로 실행시켜 준다. 실행시키고자 하는 메소드는 메소드대로 생성한 뒤에 그 메소드를 NSInvocationOperation의 객체로 만들어서 NSOperationQueue에 넣어주면 multithread로 프로그램이 돌게 된다.
NSInvocationOperation : 멀티쓰레드로 실행될 메소드의 정보가 들어가게 된다.
[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(come) object:nil] : self 는 멀티쓰레드로 실행할 메서드를 포함한 객체의 주소를 의미, @selector(come)는 come 이라는 메소드의 주소가 return 된다, object:nil은 come 이라는 메소드가 실행될때 전달하고자 하는 메시지를 나타냄.


new 메소드는 alloc이후 init 을 한것과 동일. 즉 [someClass new] == [[someClass alloc] init].


other Sources 에 보면 _prefix.pch라는 파일이 있는데 이는 매크로서 다른 소스 파일에서 import 문을 명시하지 않아도 저절로 import 가 된다. 


NSMutableArray 클래스 : object-c 에서의 array 클래스로 그 배열안에는 객체만을 넣을 수 있다.


Object-c에서의 동기화 : 하나의 쓰레드에서 작업을 마칠때까지 다른 쓰레드는 공유 객체에 접근 불가. object-c에서는 동기화 방법이 mutex(특정쓰레드에서 객체를 사용할때 다른 쓰레드에서 아예 접근하지 못하게 하는 것) 하나밖에 없다.
@synchronized(array){some thing work} :  something work 이 끝나기 까지 array 객체는 다른 쓰레드에서 접근하지 못하게 된다.
property 지정시  attribute의 nonatomic 을 nonatomic 으로 지정하면 multithread에서 접근이 가능
---------------------------------------------------------------------------------------------------


<객체의 life cycle>
someclass *aa = [[someclass alloc] init] 식으로 alloc 메소드를 호출하면 객체가 생성되고 이때 retainCount 속성이 1이 된다. 이 retainCount 속성값이 0이 되는 순간 someclass의 dealloc 메소드가 호출되면서 객체가 소멸된다. 객체가 소멸되면 다른 변수가 그 객체를 참조하더라도 더이상 사용할 수 없게 된다. 
retainCount 값을 증가시키는 방법 : retain 메소드를 호출( [aa retain])하거나 array에 추가([array addObject: aa])하게되면 retainCount 값이 증가
retainCount 값을 감소키시는 방법 : release 메소드를 호출([aa release])하거나 array에서 삭제([array removeObject:aa])하게 되면 retainCount 값이 감소하게 된다.


@propery (retain) UIImage *candle : candle 을 다른 변수에 대입시 retain 메소드가 자동 호출되게 한다.
-----------------------------------------------------------------------------------------------------


<iOS project의 종류>
1. Window-Based Application
main 메소드에서 UIApplicationMain 호출 하면 UIApplication 객체가 생성되어 loop 돌면서 이벤트가 발생하는 모니터링 발생하면 UIApplicationDelegate 객체에 알려줌. UIApplicationDelegate 시스템 이벤트, UI 이벤트 때마다 호출되는데 시스템 이벤트 처리, UI 이벤트 처리를 담당
2. View-Based Application
UIApplicationDelegate :  window based application과 유사하나 UIapplicationDelegate가 담당했던 UI 이벤트가 UIViewController로 넘겨줘서 UIViewController가 이를 처리한다. UIApplicationDelegate는 시스템 이벤트만 담당. Window based application에서는 UIapplicationDelegate가 시스템 이벤트와 UI 이벤트를 모두 담당해야 했기에 비대해짐.
3.Navigation-Based Application
화면이 여러개인 application. 화면이 전환되는 Application. 대부분의 어플이 이 타입으로 만들어져 있다.
UIApplicationDelegate가 이벤트를 처리하는데 그 객체 안에 UINavigationController라는 객체가 속성이 있는데 이것이 화면 전환을 한다. 이건 stack으로 되어 있다.
-----------------------------------------------------------------------------------------------------


<MVC model>
Model : 데이터, 메시지 - UIPickerViewDataSource. 여기에 있는 내용이 View 표시되는 .
View : 화면에 출력되는 객체 - UIPickerView
Control : View Model 연결 - UIPickerViewDelegate
View Control 방식으로 UIViewController 객체를 사용하려면  MVC pattern 으로 사용해야 한다.


instraTwitAppDelegate -> 시스템 이벤트에 대한 컨트롤
instraTwitViewController -> 화면(버튼등)에 대한 컨트롤, UIViewContoroller 를 상속한 클래스, 이 안에 UIPickerView가 속성으로 정의되어 있다.
MyPickerViewDataSource -> Model 로서 UIPickerView 객체의 데이터를 설정
MyPickerViewDelegate -> UIPickerView 객체에 대한 컨트롤
UIPickerView -> View 


위 iOS 의 project 종류의 하나인 view-based application 에서의 설명처럼 원래 UIApplicationDeleagate 인 instraTwitAppDelegate 가 UI 이벤트에 대한 컨트롤을 UIViewController인 instraTwitViewController 에게 넘겼다. 그리고 instraTwitViewController가 화면에 전체적인 내용을 컨트롤. 이 UIViewController 갯수만큼 xib파일이 생긴다.