최초 작성일 : 2010/04/11 10:40



SimpleSectionedTableViewAppDelegate.h

@interface SimpleSectionedTableViewAppDelegate : NSObject <UIApplicationDelegate> {

UIWindow *window;

UINavigationController *navigationController;

NSArray *list;

}


//retain방식으로 객체의 참조를 얻어옴. 자동으로 getter/setter 선언

@property (nonatomicretainIBOutlet UIWindow *window;

@property (nonatomicretain) UINavigationController *navigationController;

//copy방식으로 객체의 참조를 얻어옴. 자동으로 getter/setter 선언

@property (nonatomiccopy) NSArray *list;


@end



SimpleSectionedTableViewAppDelegate.m


#import "SimpleSectionedTableViewAppDelegate.h"

#import "RootViewController.h"

#import "Region.h"



@implementation SimpleSectionedTableViewAppDelegate

//인스턴스 변수들에 대한 getter/setter 구현 자동 생성

@synthesize window;

@synthesize navigationController;

@synthesize list;


//애플리케이션이 구동 완료된 후의 초기화 작업 진행

- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Create the navigation and view controllers

//뷰 컨트롤러를 생성하고 생성된 뷰 컨트롤러를 스택의 가장 아래에 놓는 네비게이션 컨트롤러를 생성

RootViewController *rootViewController =

[[RootViewController allocinitWithStyle:UITableViewStylePlain];

UINavigationController *aNavigationController =

[[UINavigationController alloc]initWithRootViewController:rootViewController];

self.navigationController = aNavigationController;


//메모리 해제

[aNavigationController release];

[rootViewController release];

//rootViewController에 지역 정보 설정 (section 설정)

[rootViewController setRegions:[Region knownRegions]];

// Configure and display the window

//윈도우에 네비게이션 컨트롤러 뷰를 추가함

[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

}


//메모리 해제

- (void)dealloc {

[navigationController release];

    [window release];

[list release];

    [super dealloc];

}



@end


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/27 09:00 



SimpleTableViewAppDelegate.h

//애플리케이션의 delegate 클래스 NSObject를 상속받고 있으며

//UIApplicationDelegate 프로토콜을 구현한다.

@interface SimpleTableViewAppDelegate : NSObject <UIApplicationDelegate> {

//인스턴스 변수 선언

UIWindow *window;


//계층적 데이터간에 이동을 표현할 수 있도록 해주는 뷰 컨트롤러 클래스

UINavigationController *navigationController;

}


//접근자와 변경자를 자동 생성하도록 해주는 @property 키워드 선언

@property (nonatomicretainIBOutlet UIWindow *window;

@property (nonatomicretain) UINavigationController *navigationController;


@end




SimpleTableViewAppDelegate.m



//필요한 헤더파일들 import

#import "SimpleTableViewAppDelegate.h"

#import "RootViewController.h"


@implementation SimpleTableViewAppDelegate


//헤더파일의 @property 키워드와 조합되어 접근자 및 변경자를 자동 생성시켜줌

@synthesize window;

@synthesize navigationController;


//UIApplicationDelegate프로토콜에 선언된 함수

//애플리케이션 시작되었음을 delegate에게 알려주는 함수. 인자는 시작된 애플리케이션 객체

- (void)applicationDidFinishLaunching:(UIApplication *)application {

/*

Create and configure the navigation and view controllers.

뷰 컨트롤러의 인스턴스 생성. alloc으로 생성되었으므로 후에 release 필요

*/


RootViewController *rootViewController =

[[RootViewController allocinitWithStyle:UITableViewStylePlain];

// Retrieve the array of known time zone names, 

// then sort the array and pass it to the root view controller.

//time zone이름 목록을 가져와 배열에 담는다.

NSArray *timeZones = [NSTimeZone knownTimeZoneNames];


//localizedCaseInsensitiveCompare : NSString 함수. 인자로 들어오는 문자열에

        //대/소문자 구분 안함, 지역화함, 비교대상임을  표시하여 리턴한다.

//@selector : 특정 함수 이름을 인자로 받아 다른 객체 내에서 그 함수가 실행되도록 한다.

//현재 코드에서는 NSString 클래스의 함수인 localizedCaseInsensitiveCompare를 @selector를 통해

//NSArray의 인스턴스인 timeZones의 함수 sortedArrayUsingSelector가 배열 값들을 정렬한는데

//사용할 수 있도록 해준다.

//즉, sortedArrayUsingSelector 함수는 localizedCaseInsensitiveCompare 함수를 이용하여

//배열 값들을 정렬한다.

//sortedArrayUsingSelector : NSArray 클래스의 함수. selector를 통헤 재공되는 특정 비교 방식을 사용하여

//정렬된 배열을 리턴하는 함수

rootViewController.timeZoneNames = [timeZonessortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

//네비게이션 뷰 컨트롤러 생성 역시 alloc을 통해 생성하였으므로 반드시 release해주어야 한다.

//initWithRootViewController : 새로 생성된 네비게이션 컨트롤러를 초기화 하여 반환한다. 

//인자는 네비게이션 스택의 가장 하부(가장 앞)에 존재하는 뷰 컨트롤러임.

UINavigationController *aNavigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];

self.navigationController = aNavigationController;

//alloc으로 생성한 인스턴스들 release

[aNavigationController release];

[rootViewController release];


// Configure and display the window.

//윈도우에 뷰를 추가하고 화면에 출력한다.

//addSubview : UIView클래스의 함수. receiver의 서브 뷰로 뷰를 추가하고 제일 위에 보여지도록 한다.

//makeKeyAndVisible : UIWindow클래스의 함수. 해당 윈도우를 가장 앞에서 사용자의 입력을 받는

        //key window로 만들고 이것을 화면에 출력한다.

[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

}


//메모리 해제

- (void)dealloc {

[navigationController release];

    [window release];

    [super dealloc];

}

@end


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/21 09:45



SimpleTableView_Prefix.pch


//

// Prefix header for all source files of the 'SimpleTableView' target in the 'SimpleTableView' project

//


#ifdef __OBJC__

    #import <Foundation/Foundation.h>

    #import <UIKit/UIKit.h>

#endif


==================================================================

main.m


int main(int argc, char *argv[])

{

    //자동으로 메모리를 관리할 NSAutoreleasePool 인스턴스 생성

    NSAutoreleasePool * pool = [[NSAutoreleasePool allocinit];


    //애플리케이션 시작

    int retVal = UIApplicationMain(argc, argv, nilnil);


    //pool에 등록된 모든 객체의 메모리 해제

    [pool release];

    return retVal;

}


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/21 09:21 


Time Zone 목록을 보여주고 스크롤이 되는 단순 테이블



블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/20 09:59 


Hello World 정리

처음으로 맥을 접하고 처음으로 아이폰을 접하고 처음으로 Objective-c를 접해봤다.
아직도 전체적인 구조를 파악할 수 있지는 못하고 다만 단편적인 하나 하나에 대한
의미를 알아가는 단계이기에 부족하기도 하고 또 잘못된 내용도 있을지 모르겠다.
이제 겨우 가장 기초적은 샘플 하나를 분석해 본 것 뿐이므로 많은 기대를 하지
않는 것이 좋겠다. 

특히 인터페이스 빌더의 설명같은 경우 애플리케이션을 구현하면서
공부한 것이 아니라 역으로 이미 만들어진 애플리케이션을 인터페이스 빌더로
열어 확인한 내용이다보니 더더욱 분석하기가 어려웠다.

오늘의 이 내용이 내일 더 나은 결과를 위한 밑거름이 될거라 생각하며
첫 예제 분석에서 중요하다고 생각되는 몇가지를 정리하면서 분석을 마친다.


NSAutoreleasePool : 
메모리 자동 관리를 위한 클래스. 
NSAutoreleasePool의 인스턴스가 생성되고 release되는 블럭 사이에서 팩토리 함수로 생성한
대부분의 객체 또는  autorelease 메시지를 받은 객체들은 모두 NSAutoreleasePool가
관리를 하게 되며 NSAutoreleasePool의 인스턴스가 release되는 순간 NSAutoreleasePool이
관리하던 모든 객체들이 메모리에서 해제된다.
최초 main.m에 자동 코딩되는 내용은 지우지 않는 것이 좋다.

UIApplicationMain :
UIKit 프레임워크에 선언된 함수로 main.m 내에서 호출되어 애플리케이션을 객체를 생성하고
위임(delegate)하며 이벤트 사이클을 설정한다.

아이폰의 애플리케이션은 기본적으로 이 함수 호출로부터 시작한다.

delegate : 
애플리케이션이 객체간 메시지를 전달하는 방법 중 하나
많은 UIKit 프레임워크의 클래스들이 delegation을 사용한다.
사용자로부터 어떤 액션을 받게 되면 그 액션에 대한 내용을 delegate 프로토콜을 구현한 
클래스로 넘기게 되고 이 클래스에서 실제로 어떤 응답을 처리해야 할지 구현하게 된다.

Hello World 샘플의 경우 다음과 같은 delegation이 이루어지고 있다.

UIApplication에 대한 delegation
HelloWorldAppDelegate.m은 UIApplicationDelegate프로토콜을 사용하고 있는데
UIApplicationDelegate는 UIApplication에 대한 delegate 프로토콜이며 애플맄이션의 실행과
종료, 메모리 부족에 대한 경고, URL 리소스의 사용, status-bar의 방향 변경 및 
기타 시스템 관련 이벤트를 처리한다.

UITextField 대한 delegation
MyViewController.m은 UITextFieldDelegate프로토콜을 사용하고 있으며
이것은 UITextField에서 발생하는 이벤트에 대한 응답 처리를 담당한다.
textFieldShouldReturn는  이 프로토콜에서 정의된 함수로 텍스트필드에서
return키가 입력되었을 경우의 이벤트를 처리한다.

UIResponder :
이벤트에 대한 응답 처리를 위한 인터페이스를 정의한 클래스.
UIApplication이나 UIView와 같은 클래스들의 부모 클래스이고 이 예제에서 사용된
MyViewController의 부모클래스인 UIViewController클래스도 UIResponder를 상속받고 있다.

일반적으로 터치(touch) 이벤트와 동작(motion) 이벤트 2가지가 있는데
MyViewController에 구현된 touchesBegan 함수는 이 UIResponder에 선언된 함수고
화면상에 한 개 이상의 손가락이 눌렸을 때의 이벤트를 처리한다.

protocol : 
다중 상속 처리를 위한 함수 선언들의 집합체로 java의 interface와 유사하다.
Objective-c는 기본적으로 다중 상속이 불가능한데 protocol은 2개 이상을
사용할 수 있다.

기본적으로 프로토콜을 사용한 클래스에서는 프로토콜에 선언한 함수를 모두 구현해야 하나
다음의 옵션으로 선택적으로 구현 가능하다.

@optional : 구현하지 않아도 됨
@required : 반드시 구현해야 함
키워드 없음 : 반드시 구현해야 함

Hello World 예제의 MyViewController에서 사용된 UITextFieldDelegate 프로토콜은
모든 함수들이 @optional로 지정되어있어 이 예제에서는 textFieldShouldReturn함수
하나만 구현되어있다.

property :
@property 키워드는 접근자(accessor. getter)와 변경자(mutator, setter)를 
자동으로 생성해준다.

선언부(.h파일)에 @property로 변수를 지정해 놓으면 별다른 접근자 함수 선언 없이
구현부(.m파일)에 접근자 함수를 구현할 수 있다.

더욱 간편하게는 선언부에서 @property로 지정한 변수에 대해 구현부에서
@synthesize키워드를 이용해 지정해 놓으면 함수 구현까지 자동으로 이루어진다.

@class :
어떤 클래스에서 참조하여 사용하고자 하는 클래스를 지정할 때 사용하는 키워드
일반적인 #import와 다른 점은 #import가 이미 참조할 클래스의 선언부가 필요한 반면
@class로 지정을 해 놓으면 실제적인 클래스 선언 없이 클래스 이름만으로 해당 클래스를
사용하겠다고 컴파일러에게 알려줄 수 있다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/12 09:43



MyViewController.h


#import <UIKit/UIKit.h>


//UIViewController을 상속받고

//UITextFieldDelegate 프로토콜을 따르는 뷰 컨트롤러 선언

@interface MyViewController : UIViewController <UITextFieldDelegate> {

//nib 파일 내의 객체와 연결될 인스턴스 변수 선언

//텍스트필드와 라벨과 연결됨

IBOutlet UITextField *textField;

IBOutlet UILabel *label;


//문자열 형식의 인스턴스 변수 선언

NSString *string;

}


//@property를 통한 접근자와 변경자 선언 간편화

@property (nonatomicretain) UITextField *textField;

@property (nonatomicretain) UILabel *label;

@property (nonatomiccopy) NSString *string;


//구현해야 할 메서드 선언 : 텍스트필드에서 입력받은 문자열을 라벨로 업데이트 함

- (void)updateString;


@end



MyViewController.m


#import "MyViewController.h"



@implementation MyViewController


//헤더 파일의 @property와 짝을 이루어 접근자와 변경자 자동 생성

@synthesize textField;

@synthesize label;

@synthesize string;


//뷰가 로드된 이후 호출되는 함수로 다른 nib 객체들에 대한 접근도 가능하다.

//주로 컨트롤러가 생성될 때 초기화 하는 내용이 들어감

- (void)viewDidLoad {

    // When the user starts typing, show the clear button in the text field.

  // 사용자의 키 입력이 시작되면 텍스트필드에 클리어 버튼을 보여주도록 설정

    textField.clearButtonMode = UITextFieldViewModeWhileEditing;


    // When the view first loads, display the placeholder text that's in the

    // text field in the label.

    // 뷰가 처음 로드되면 텍스트필드의 placeholder에 있는 텍스트를 라벨에 보여줌

    // placeholder는 텍스트필드에 입력된 문자열이 없을 경우 보여지게 될 기본 문자열을 저장하는

    // UITextField 클래스의 속성

    label.text = textField.placeholder;

}


//사용자 구현 메서드

//이 클래스의 인스턴스 변수인 string에 텍스트필드에 입력된 문자열을 대입하고

//다시 이 인스턴스 변수 string의 값을 label에 대입함

- (void)updateString {

// Store the text of the text field in the 'string' instance variable.

// textFeield.text는 텍스트필드에 입력받은 문자열을 저장하고 있는 UITextField 클래스의 속성

self.string = textField.text;


        // Set the text of the label to the value of the 'string' instance variable.

// label.text는 label을 통해 보여지게 될 문자열을 저장하고 있는 UILabel 클래스의 속성

label.text = self.string;

}


//UITextFieldDelegate 프로토콜에 있는 인스턴스 메서드

//텍스트필드 내에서 리턴키가 입력된 경우의 처리를 담당함

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {

// When the user presses return,

// take focus away from the text field so that the keyboard is dismissed.

// 텍스트필드에서 리턴키가 입력되면 키보드를 사라지게 하고 updateString 메서드를 호출하여

//  텍스트필드에 입력된 값을 label에 넣도록 함

if (theTextField == textField) {

[textField resignFirstResponder];


        // Invoke the method that changes the greeting.

        [self updateString];

}

return YES;

}


//UIResponder 클래스에 있는 인스턴스 메서드

//UIResponder 클래스는 객체들의 이벤트에 응답하고 이벤트를 핸들링하는 클래스로

//UIApplicationUIView 등의 클래스들의 상위 클래스이다.

//touchesBegan는 뷰나 윈도우상에 한 개 이상의 손가락 터치가 일어난 경우 이 이벤트를 받아 처리한다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    // Dismiss the keyboard when the view outside the text field is touched.

  // 뷰에서 텍스트필드 영역 밖에 터치가 발생한 경우 키보드를 감춘다.

    [textField resignFirstResponder];


    // Revert the text field to the previous value.

  // 텍스트필드의 문자열은 이전 문자열로 바꾼다.

    textField.text = self.string;


  // 부모 클래스의 touchesBegan 메서드 호출

    [super touchesBegan:touches withEvent:event];

}


//메모리 해제

- (void)dealloc {

// To adhere to memory management rules, release the instance variables.

    // 'textField' and 'label' are objects in the nib file and are created when the nib

    // is loaded.

[textField release];

[label release];

[super dealloc];

}



@end


참고문헌 :
[시작하세요 아이폰 3 프로그래밍], 위키북스
[예제로 시작하는 아이폰 개발], 에이콘

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/03/12 07:21



HelloWorldAppDelegate.h


//UIApplicationDelegate을 사용하기 위해 UIKit Framework를 삽입

#import <UIKit/UIKit.h>


//MyViewController 클래스를  클래스 내에서 사용하겠다는 의미

//우선은 MyViewController라는 이름의 클래스를 사용하겠다고 '예약' 해놓은

//상태로서 후에 MyViewController클래스의 구현이 변경되어도  클래스를

//재컴파일  필요가 없다.

@class MyViewController;


//HelloWorldAppDelegate 선언. NSObject를 상속 받고 있으며

//UIApplicationDelegate 프로토콜을 따른다.

@interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> {

   

    //IBOutlet은 nib(xib)파일들 안의 객체와 연결되는 인스턴스 변수임을 알려주는 키워드

    IBOutlet UIWindow *window;


    //@class에 선언된 MyViewController 클래스를 인스턴스 변수로 사용함

    MyViewController *myViewController;

}

//@property는 컴파일시에 .m파일 내의 @synthesize키워드와 결합하여

//자동으로 접근자와 변경자(getter, setter) 메서드를 생성해준다.


//retain : 메모리에 할당된 특정 객체를 객체를 참조한다는 것을 의미함

//            retain 카운트가 있어 참조되면 1이 더해지고 릴리즈되면 1이 감소하여

//            카운트가 0이되면 메모리에서 해제된다.

//            이 속성을 사용하게 되면 해당 객체는 autorelease를 사용하게 된다.

//nonatomic : 접근자와 변경자 메서드가 생성되는 방법과 관련된 키워드

               멀티쓰레드 프로그램 작성시 필요한 추가 코드를 생략할 수 있도록 해줌

               멀티쓰레드 프로그램 작성시에는 atomic으로 사용하는 것이 좋음

@property (nonatomicretain) UIWindow *window;

@property (nonatomicretain) MyViewController *myViewController;


@end



HelloWorldAppDelegate.m


//인터페이스 선언 파일 삽입

#import "HelloWorldAppDelegate.h"


//.h파일에서 @class로 선언한 MyViewController를 사용하기 위해서 헤더파일 삽입

#import "MyViewController.h"



@implementation HelloWorldAppDelegate


//헤더 파일의 @property와 짝을 이루어 자동으로 접근자와 변경자(getter, setter)메서드를

//생성해준다. 이 코드를 통해 코딩시에는 보이지 않지만 접근자인 window 라는 메서드와

//변경자인 setWindow라는 메서드가 생성된다. myViewController도 마찬가지...

@synthesize window;

@synthesize myViewController;


//어플리케이션이 모든 설정 작업을 마치고 사용자와 상호 작용할 준비를 하는 메서드

//이 메서드는 subview형태로 뷰 컨트롤러의 뷰를 애플리케이션의 메인에 붙여 사용자가

//윈도우를 볼 수 있도록 한다.

//리턴 값은 없으며 메인 애플리케이션의 객체를 인자로 받는다.

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Set up the view controller

    // 뷰 컨트롤러 생성

    // nib파일의 이름인 HelloWorld와 NSBundle 객체를 인자로

    //  MyViewController의 인스턴스를 생성함

    //  NSBundle은 애플리케이션의 Root와 하위 경로들을 찾을 수 있도록 해주며

    // 해당 경로의 리소스에 접근할 수 있도록 해준다.

  MyViewController *aViewController = [[MyViewController allocinitWithNibName:@"HelloWorld" bundle:[NSBundlemainBundle]];


//인스턴스 변수 myViewController에 새로 생성한 aViewController를 대입

self.myViewController = aViewController;


//alloc을 통해 생성했으므로 release해줌

[aViewController release];

    

     // 애플의 SDK상에서 각 애플리케이션은 단 하나의 UIApplication인스턴스를 가지며

     //   그 하나의 인스턴스는

//  [UIApplication sharedApplication]을 통해 접근 가능하다.

//  [UIApplication sharedApplication]을 통해 상태 바 스타일을 지정하고 있는 코드

//  상태바 스타일은 다음 3가지 중 하나

//  UIStatusBarStyleDefault,

     // UIStatusBarStyleBlackTranslucent,

     // UIStatusBarStyleBlackOpaque

    [[UIApplication sharedApplicationsetStatusBarStyle:UIStatusBarStyleBlackOpaque];

// Add the view controller's view as a subview of the window

// myViewController를 subview로 윈도우에 붙임

UIView *controllersView = [myViewController view];

[window addSubview:controllersView];

[window makeKeyAndVisible];

}


//메모리 해제 메서드

- (void)dealloc {

[myViewController release];

[window release];

[super dealloc];

}


@end


 참고문헌 :
[시작하세요 아이폰 3 프로그래밍], 위키북스
[예제로 시작하는 아이폰 개발], 에이콘

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^