* 아이폰 프로젝트의 구조

  - MainWindow.xib : UI가 만들어지는 출발
  - File's Owner : 각종 디자인 객체들을 제어하기 위한 클래스  
  - First Responder : 현재 활성화되어 사용자로부터 무엇인가 리액션을 받고 있는 객체의 클래스. 어떤 개체(예를 들어 키보드)가 First Responder가 되면 가상키보드가 뜨고 사용자로부터 입력을 기다린다. 프로그램에서 키보드의 First Responder를 해제하면 자동으로 키보드가 사라진다
  - XCode와 인터페이스 빌더는 별개의 프로그램이므로, 인터페이스 빌더에서 만든 객체와 XCode 상의 코드를 연결시키는 작업을 해 주어야 한다. 하지만 XCode의 모든 코드들이 인터페이스 빌더로 넘어오지는 못한다. 이 때문에 IBOutlet(변수)과 IBAction(메소드) 키워드가 존재한다. 이것이 붙으면 인터페이스 빌더에서 인식하게 되며, XCode상에서는 별다른 의미를 갖지 못한다(타입도 void임)
  - 주 실행이 되는 main 함수는 main.m에 위치하게 된다
  - AppDelegate : 주 프로그램 실행을 위한 처리들을 담당. 시작하기 전에 팝업창을 띄워 뭔가를 확인한다든가 할 때에 사용한다. 다른 모든 클래스는 File's Owner에 있지만 유일하게 윈도우에 대한 것은 AppDelegate에 있다
  - UIApplication : 아이폰에서 실행되도 좋은 프로그램인지 검사
  - WillTerminate : 종료 직전에 호출되는 메소드. 프로그램 종료 후 나중에 다시 실행했을 때 마지막에 하고 있던 작업이 그대로 남아있게 하는 처리를 여기에서 한다. 같은 이유로 프로그램 종료시에 없어져야 하는 객체, 해제해야 하는 메모리의 작업도 여기에서 해 주어야 한다. 이때 뜨는 윈도우의 디자인을 바꾼다거나 할 때에는 //Override point for customization after app launch 주석 바로 다음에 해준다.
  - [window addSubview:viewController.view];  <-- 뷰 위에는 얼마든지 다른 것이 올라갈 수 있지만 윈도우는 하나밖에 깔 수 없다


* 인터페이스 빌더의 xib 편집창
  - 기본적으로 항상 가운데의 계층형으로 창 표시 타입을 놓고 보는 버릇을 들이자


* 변수 연결하기
  - IBOutlet으로 지정해서 인터페이스 빌더와 연결
  - dealloc으로 해제


* Inspector 창 - 첫번째 탭 속성창
  - Drawing - Opaque를 체크 : 뒤쪽을 투명하지 않게 하므로 속도가 빨라진다. 다만 텍스트 필드에서는 사용하지 않는 것이 좋다
  - Clear Context Before Drawing : 무엇인가 객체를 그릴 때 뒤쪽을 지우고 새로 그리는가 아닌가를 설정
  - Clip Subview : 화면상에서 보이지 않는 부분을 그리지 않는다. 
  - Interaction - User Interaction Enabled : 유저 터치 입력을 받는다. 항상 켜두어야 함
  - Multiple Touch : 멀티터치 입력을 가능하게 한다


* XCode - .plist 파일
  - 아이콘에 쓸 png파일은 Finder에서 찾아서 XCode의 Resources 트리에 끌어다 놓으면 등록된다
  - plist 파일의 Icon file 란에 등록한 파일명을 입력하면 완료
  - 아이콘 사이즈는 60x60 이상을 넘어가면 안된다
  - 이미지는 기본적으로 확대/축소에 기대하지 말고 큰 것과 작은 것을 두개 다 준비해 두는 것이 좋다
  - Bundle이라는 용어가 많이 등장하는데 기본적으로 '내 애플리케이션'을 일컫는다고 생각하면 된다
  - Bundle Version을 사용해서 버전번호를 표기한다. 업데이트가 필요할 때에도 아이폰이 이 버전번호를 비교하여 업데이트 여부를 유저에게 알려주게 된다
  - plist 파일은 우클릭한 뒤 Open as -> Plain Text File 하면 XML 파일로 읽게 된다


* 디자인 패턴
  - 이벤트를 생성하는 것을 디자인 패턴이라고 한다

  - Delegation : 하나의 객체가 delegate 지정된 다른 객체에 주기적으로 메시지를 전달 -> 메시지를 처리할 수 있다면 처리해 달라고 요청하는 것
  - 상위 클래스로부터 모두 상속받아서 사용하는 것이 아니라, 원하는 클래스 이름에 delegate를 붙여서 그 클래스의 원하는 부분만 선택(프로토콜)하여 받아오는 것
  - -(void)applicationDidFinishLaunching:(UIApplication *)application
  - -(void)applicationWillTerminate:(UIApplication *)application

  - MVC 패턴 : 모션, 뷰, 컨트롤러로 구별해서 동작을 정의한다 . 테이블 뷰 형식의 프로그램을 이 방식으로 한다.

  - Target-Action 패턴 : 객체에 메시지를 보내서 객체를 제어하게 한다. 일반적으로 이벤트 처리에 가장 많이 사용된다
  - IBAction 키워드를 사용해서 넘기면 이 방식이 된다 . 리액션에 따라 개체가 바뀌는 경우(눌리는 버튼 등)에는 원래의 자기 객체가 무엇인지도 기억해놓고 있어야 하므로 -(IBAction) click(id)sender와 같이 sender를 사용해줘야 한다. 이 때에는 형변환을 해줘야 한다
  - 코딩으로 만들어도 된다. [객체 AddTarget : 메소드소유객체명 action : @selector(메소드명) forControlEvents : (UIControlEvents) 이벤트 이름 과 같은 형식이 된다
  - 소유 객체명은 Target-Action 방식에서는 거의 self가 되지만 MVC 패턴에서는 소유 객체와 구현부가 다르므로 self를 사용할 수 없다는 것에 주의


* 윈도우기반 어플리케이션
  - 기본적으로 윈도우 하나만이 존재한다
  - 만든 뒤 UIViewController의 서브클래스를 추가
  - 새로 클래스파일을 추가할 때에 3개의 옵션 체크가 중요하다(xib 파일도 함께 만드느냐 그렇지 않느냐 등등)
  - xib 파일도 함께 만들면 처음에는 classes 폴더에 함께 생기므로 Resources 폴더로 옮겨 준다


* 예제 - AppDelegate.h

//
//  _709_2AppDelegate.h
//  0709_2
//
//  Created by iMac2_13 on 10. 7. 9..
//  Copyright __MyCompanyName__ 2010. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "TestViewController.h" // 추가한 뷰 컨트롤러의 헤더 파일을 import함

@interface _709_2AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
TestViewController * viewController; // 윈도우에 추가할 뷰 컨트롤러의 변수 선언
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) TestViewController * viewController; // 추가한 뷰 컨트롤러의 멤버에 쉽게 접근하기 위한 프로퍼티 설정

@end


* 예제 - AppDelegate.m

//
//  _709_2AppDelegate.m
//  0709_2
//
//  Created by iMac2_13 on 10. 7. 9..
//  Copyright __MyCompanyName__ 2010. All rights reserved.
//

#import "_709_2AppDelegate.h"

@implementation _709_2AppDelegate

@synthesize window;

@synthesize viewController; // 프로퍼티로 지정한 변수의 synthersize 지정


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch

viewController = [[TestViewController alloc]init]; // 추가한 뷰 컨트롤 변수에 메모리 할당, 초기화
[window addSubview:viewController.view]; // 윈도우에 추가한 뷰 컨트롤러의 뷰 붙이기. 중요함!
    [window makeKeyAndVisible];
return YES;
}


- (void)dealloc {
[viewController release]; // 지정한 인스턴스 변수 release
    [window release];
    [super dealloc];
}


@end


* 이벤트 객체 알아내기

  - IBOutlet 변수 이용하기
  - 어떤 메소드로부터 호출된 것인지 알기 위해서 Tag라는 속성을 줄 수도 있다. 다만 이 경우에는 절대로 같은 Tag를 설정해 주면 안된다. 
  - Tag를 사용하게 되면 IBOutlet은 쓸 필요가 없어진다
  - 
Posted by windship