오브젝트C2010.10.12 13:05
[objective-c] 오브젝트 c에 대한 기본적인 개념 정리

2.1 오브젝티브-C, OOP를 위한 언어

2.1.1 역사

2.1.2 클래스와 인스턴스

2.1.3 메시징

  오브젝트-C의 함수 호출은 대괄호[]이며

 오브젝트가 앞에 오고 오브젝트의 메소드가 뒤에 붙는 형식

ex1) myView라는 뷰에서 aquaGradient라는 그러디언트를 그리는 오브젝트-C함수

[myView drawMyGradient:aquaGradient fromValue:0.0 toValue:1.0 opaque:YES];

 오브젝트     메소드이름         매개변수1       매개변수2      매개변수3   매개변수4

  

> 호출되는 함수의 형식? 예-

- (void)drawMyGradient:(CGGradientRef)gradient fromValue:(float)start toValue:(float)end opaque:(BOOL)opaque

  

ex2) 리턴값을 받는 함수 호출

destStr = [sourceStr subStringFrom:2 to:5];

  

sourceStr오브젝트의 클래스안에는 다음과 같은 메소드가 들어있을 것이다.

- (NSString*)subStringFrom:(int)from to:(int)to

  

ex3) 리턴되는 값이 코코아클래스의 인스턴스라면 대괄호를 다시 만들어서 또 다른 메소드를 호출해야함

hashValue = [[sourceStr subStringFrom:2 to:5] hash];

  

2.1.4 인스턴스 변수와 엑세서 메소드

  (클래스는 내부적으로 멤버변수(인스턴스변수)를 가질수 있고 외부에서 직접 멤버변수에 접근할수 없다)

  

접근하는 메소드 getter, setter

  

getter는 메소드 변수의 이름을 그대로 사용

Person이 클래스 이름, 인스턴스 변수 name, 인스턴스 오브젝트 me

ex) NSString *myName = [me name];

  

setter 메소드

- 변수 이름앞에 set을 붙이고 변수의 첫 문자를 문자로 바꿈

ex) [me setName:@"Yoon"];

  

2.1.5 코코아 클래스 만들기

  코코아 클래스 : 헤더파일 + 임플리먼트 파일

  

1. 헤더(.h)

  @interface, @end로 구성

  

@interface 클래스:슈퍼클래스(<프로토콜>)

(프로토콜은 생략가능)

{

    // 인스턴스 변수

}

//메소드 구현

@end

  

2. 임플리먼트 파일(.m)

  @implement 클래스이름

// 메소드 구현

  

@end

  

2.1.6 헤더포함

 : #import는 다른 클래스의 헤더를 불러오는 역할

 : #include와 비슷하지만 중복 포함 에러 예방

 : 큰따옴표""는 프로젝트 안에서 바로 찾을 수 있는 파일에 사용

 : <>는 경로를 이용해 찾아야 하는 헤더 파일에 사용

 : 하지만 <>는 교차 포함의 에러를 방지하지 못함, 이런경우 헤더파일에서는

   @class 클래스이름

   위 형식으로 클래스의 존재만 알리고 임플리먼트파일에서 실제 #import하는 것이 좋다.

 

2.2 메모리 관리

2.2.1 원칙

 : "만든곳에서 릴리즈한다"-> 이 원칙은 OOP(Object Oriented Programming)(Object-C책 보기ㅠ)

 : 어떤 인스턴스 오브젝트에 값을 넣을때 넣는 쪽에서 릴리즈하고 받은 쪽에서 보관해야함.;

 : 오브젝트의 라이프 사이클 관리는 구현의 측면에서 본다면 오브젝트의 리테인 카운트(retain count)를 관리하는 것

 : 오브젝트의 리테인 카운트가 1이상이면 오브젝트가 살아있는 것이며 리테인 카운드가 0이 되면 해당 메모리는 해제

 "이 오브젝트는 언제 리테인 카운트를 0으로 만들어야 하는가?"

 

2.2.2 alloc, retain, release

 : 모든 코코아 오브젝트가 사용할 수 있는 메소드

 : NSObject에 선언된 메소드

 

 > NSOjbect

 : 코코아의 루트 클래스

 : NSobject프로토콜은 NSObject가 준수하는 프로토콜

 

 

 +alloc 메소드를 받으면 특정 클래스의 인스턴스 오브젝트가 메모리에 전개되며 리테인 카운트는 1이 됨

 

- retain 메소드르 받은 오브젝트의 참조 카운트는 1 증가, 어떤 오브젝트를 확실하게 보호하고 싶을때 retain 호출

 

- release 메소드를 받은 오브젝트의 참조 카운트는 1감소, 오브젝트의 사용을 마치면 오브젝트에 release 메소드를 보냄으로써 오브젝트를 메모리에서 해제

 

2.2.3 +메소드와 -메소드

: +가 붙은 메소드는 클래스에서 바로 호출

: -가 붙은 메소드는 인스턴스 메소드

: 메모리와 관련해서 +메소드를 이용해 생성한 인스턴스 오브젝트는 +alloc, -init을 이용해 생성하고 초기화한 인스턴스 오브젝트와 달리 오브젝트의 라이프 사이클을 관리할 필요가 없음

 

> 런타임

 : 애플리케이션이 기동되면 애ㅡㄹ리케이션에 연결되어 있는 프레임워크의 모든 클래스들이 오브젝트화 됨

 ex)NSString이라는 클래스가 있다면 NSString이라고 하는 클래스 오브젝트가 애플리케이션 시동와 함께 생성, 클래스 오브젝트와 함께 함수 포인터의 테이블이 생성,

NSString을 서브클래스해서 MyString이라는 클래스를 만든다면 오버리아디한 메소드는 MyString의 함수 포인터를 가리킬 것이고 오버라이드하지 않은 메소드는 NSString의 함수 포인터를 가리킬 것이다.

 

2.2.4 addObject, addSubView

 : 코코아에는 몇가지의 컬렉션이 있다.

 : 오브젝트가 컬렉션에 더해지면 그 순간 리테인 카운트가 1증가, 그리고 컬렉션에서 제외되는 순간

   리테인 카운트가 1감소

   -> 컬렉션 바깥에서 리테인 카운트를 관리하면 됨

 

 

 

 >> 컬렉션(?)

 

 

ex) NSString *stringObject = [[NSString alloc] initWithString:@"Yoon"];

[mutableArray addObject:stringObject[; // array에 스트링 넣음

[stringObject release];

 

위의 코드는 stringObject의 주소값은 mutableArray에 살아있고

stringObject가 그 mutableArray 안에 있는 한 보호된다는 것.

 

* 뷰 오브젝트 또한 컬렉션과 유사한 방식으로 운용

뷰를 만들어서 다른 뷰에 서브 뷰로서 더하면 그 서브 뷰의 오브젝트 사이클은 슈퍼뷰가 관장하므로

서브 뷰는 슈퍼뷰의 외부에서는 리테인 카운트가 0이 되어야 함

 

2.2.5 autorelease pool

 : "곧 릴리즈 될 오브젝트들이 모여 있는 곳"

 : 코코아의 런타임은 매 이벤트 발생 시마다 오토릴리즈 풀에 있는 오브젝트를 메모리에서 제거

 : 어떤 오브젝트를 오토릴리즈로 선언하는 것은 이 메소드 내에서

   수명은 보장하되 이 메소드가 끝나면 언제 없어지든 상관하지 않겠다는것을 의미

 : 오토릴리즈로 선언하는 방법 -> +메소드를 이용하여 생성한 인스턴스 오브젝트

 ex)

 

 //NSString은 클래스 

NSString *stringObject;

//아래 두개 다 오토릴리즈...

//alloc, init, autorelease

stringObject = [[[NSSTring alloc] initWithString:@"Yoon"] autorelease];

//init with release

stringObejct = [NSString stringWithString:@"Yoon"];

 

(아- 잘 모르겠다;)

 

 : 오토릴리즈는 메소드 내에서 오브젝트를 만들어 리턴한 뒤 릴리즈 해야할 때도 사용됨

 

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString release];

   return composedString;

}

 

 

성과 이름을 합쳐서 문자열을 만든 뒤 리턴하는 메소드

composedString은 메모리에 alloc되었으므로 release해야하는데

문제는 release되는 시점(;)

리턴 전에 릴리즈를 해야하는데 이 경우 이미 릴리즈된 포인터를 리턴하게 되는 문제가 생김

그러므로 일단 리턴한 뒤 약간의 시간차를 두고 릴리즈하는것이 필요

즉, 릴리즈를 예약^^

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString autorelease];

   return composedString;

}

 

autorelease메소드는 모든 코코아 오브젝트에 대해 릴리즈를 예약하는 것

일단 리턴되는 시점까지는 메모리가 보호되며 안정적으로 리턴된 뒤 일정 시점이 지나면 릴리즈됨

 

2.3 Delegate, Subclass

2.3.1 Delegate

 : "그대로 위임한다"

 : 누가?

   - 델리게이트를 필요로 하는 오브젝트는 주로 View의 서브클래스들이나 Controller 오브젝트

 : 무엇을?

   - 이벤트에 대한 처리 권한을 위임

   - 자기 자신에게 일어난 문제를 자기가 직접 처리하지 않고 다른 오브젝트에 위임해서 처리하는 방식

 : 누구에게?

   - 기존의 클래스 중 해당 이벤트를 가장 잘 처리할 수 있는 클래스가 위임을 맏음

      (델리게이트를 처리하기 위해 별도의 클래스를 정의하기도 함)

ex) UIApplication클래스의 델리게이트 메소드는 -applicationDidFinishLaunching:메소드

 UIApplication클래스는 애플리케이션이 시동될 때 생성되고 종료되면 없어지는 싱글톤(애플리케이션 내에 유일한 오브젝트) 패턴의 오브젝트이다.

 

2.3.2 Subclass

 : 클래스를 상속받아 기능을 확장하거나 원래의 기능을 변경하는 것

 : 코코아는 단일상속 체계를 가진다.

   -> 모든클래스는 하나의 슈퍼 클래스만을 가지고 있다.

   -> 최상위 클래스인 root클래스로 NSObject가 존재

 

2.3.3 Subclass? Delegate?

  : 동일 목적 -> UI 요소 등에 발생한 이벤트를 처리하는 것

  ex) "사용자가 리턴키를 입력하면 특정한 반응을 하길 바란다"

 위 작업을 수행하기 위해서

키 입력과 관련된 메소드를 오버라이드해서 들어온 키가 리턴키인 경우를 얻어내려고 하지만;

서브클래싱은 작업이 만만치 않다.

이때 필요한것이 델리게이트 패턴

개발자가 복잡한 내부구조를 몰라도 이벤트 발생시에 델리게이트로 지정된 오브젝트에 양속된 메소드를 호출해 주는것

(잘- 모르겠다;)

 

2.3.4 프로토콜

 : "구현하기로 약속한 메소드"

 : 특정 프로토콜을 구현하는 클래스를 만든다면 프로토콜에 명시되어 있는 메소드를 전부 또는 일부 구현함으로써 프로토콜의 기능을 구현하게 됨

 

2.4 용어정리

2.4.1 IBOutlet & IBAction

  : 인터페이스 빌더 파일과 연결되는 인스턴스 변수와 액션 메소드임을 선언하는 예약어

  : IBAction값은 void형

 

2.4.2 id

 : id 타입으로 정의한 변수의 type은 컴파일 시가 아닌 런타임 시에 결정

 

2.4.3 SEL, @selector()

 : SEL은 함수에 대한 참조를 가짐

   -> 즉 함수 포인터임

   -> 컴파일된 오브젝트-C는 함수테이블을 만들고 구별자와 메소드를 적어둔 뒤 런타임 시에 매칭시키는 방식 사용

   -> 이때 컴파일된 셀렉터의 타입이 SEL이며, 메소드 이름을 이용해 SEL를 얻어내는 지시어가 @selector()

        임

 

 

 

Posted by 오늘마감
아이폰에서 오픈소스로 Google API 사용하는 방법 정리

고맙게도 아이폰에서 Google API를 사용하기 위한 라이브러리가 오픈 소스로 있습니다.

Google Data APIs Objective-C Client Library

위 라이브러리를 사용하면, 이렇게 많은 것을 할 수 있습니다.. 대단하죠?

위 라이브러리를 아이폰에 사용하는 샘플 코드도 있습니다.
Example iPhone project showing how to use GData API for Google Docs from Objective-C.

그런데 샘플만 본다고 쉽게 되는게 아니라서..
간단히 방법을 소개 해 보겠습니다.


1. 최근 소스를 다운 받는다.

가장 최근 소스를 원하시는 분들은...
svn export http://gdata-objectivec-client.googlecode.com/svn/trunk/Source gdataSource

터미널에서 이렇게 해서 받습니다.

2. 내 프로젝트 소스 파일을 추가 한다.

xcode에서 새로운 프로젝트를 생성합니다. 
그리고 라이브러리 소스 코드를 내 프로젝트 하위 경로에 복사해 주시고, 프로젝트에 드래그 해서 추가 합니다.

그리고 사용하지 않는 파일을 제거 합니다.


위에 표시된 파일들을 제거해 줍니다. 그리고 Clients에서는 자신이 프로젝트에 사용할 파일을 남기고 제거 합니다.


2. 프로젝트 설정하기.

프로젝트에서 Get Info를 해서 프로젝트 설정을 합니다.

먼저 Configuration에서 All Configurations를 선택합니다.
  • Header Search Paths: /usr/include/libxml2
  • Other Linker Flags: -lxml2
를 각각 입력 합니다.
그리고 Configuration에서 Debug를 선택 합니다.
  • Other C Flags: -DDEBUG=1
를 입력합니다.



3. 빌드 후 사용하기.

빌드 후에 사용 하시면 됩니다.
별거 아닌데.. 전 고생을 해서 -_-;; 이렇게 글로 남깁니다.

그런데 최신 트렁크 빌드에서는 오류가 나지 않지만, 
Example iPhone project showing how to use GData API for Google Docs from Objective-C.
위 샘플에서는 아래와 같은 오류가 발생 합니다.


이건 애플사에서 iPhone 3.0 SDK에서 NSTask를 제거 해서 생긴 문제 입니다.
이 문제를 해결하는 방법은 GDataDefines.h 파일에서 아래를 추가 해 주면 됩니다. 

#define  GDATA_SKIP_LOG_XMLFORMAT 1

참고로 여기까지 해서 빌드한 샘플을 올립니다. 참고 하세요.
코딩은 전혀 없습니다 ^^;; 빌드 까지 입니다..



출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=56
Posted by 오늘마감
Simple TableView 정리

> 테이블 뷰 스타일 : 플레인(Plain), 그룹드(Grouped)

> contentView

 테이블 뷰 셀에 내용을 표시하는 전체를 가리킴

다음에 나오는 구성요소들의 슈퍼뷰

> textLabel

 UILabel의 인스턴스 오브젝트

 문자열 표시할 때 사용

> imageView

 테이블 뷰의 왼쪽에 자리잡고 있으며 주로 썸네일이나 아이콘을 표시하는데 사용

> accessoryView

  테이블 셀의 속성을 표시하기 위한 뷰

> detailTextLabel

 textLabel의 내용을 보조하는 내용이 들어가는 레이블

> 테이블 뷰의 동작 방식

 1. 테이블 뷰가 자신에게 데이터를 공급할 책임이 있는 데이터 소스 오브젝트를 찾음

 2. 데이터 소스를 찾았다면 제일 먼저 몇 개의 섹션을 준비해야 할지 물어봄

    numberOfSectionsInTableView:메소드가 호출

 3. 섹션의 개수가 정해졌다면 각 섹션별로 준비해야 할 로우(row)의 개수를 물어봄

    TableView:numberOfRowsInSection:메소드가 섹션의 개수만큼 호출됨

 4. 섹션과 각 섹션별 로우의 개수가 완전 정해졌다면 테이블 뷰의 크기는 결정되었음.

    이제 각 섹션의 로우별로 어떤 테이블 셀을 채워넣어야 할지 물어봄

   TableView:TableViewcellForRowAtIndexPath:메소드를 통해 각 섹션별 로우에 그려져야

    할 테이블 셀을 만들어서 리턴

 -  테이블 뷰에는 데이터소스와 델리게이트 오브젝트를 필요로 함

 -  데이터소스는 테이블 뷰에 정보를 뿌려줄 책임있는 오브젝트, 델리게이트는 테이블 뷰에서 발생한 여러가지 이벤트를 대신 처리해줄 오브젝트

 -  데이터 소스 역할을 하는 컨트롤러 오브젝트 내에서 델리게이트 프로토콜 메소드를 구현해 테이블 뷰에 뿌려줘야 하는 형식

 -  테이블 뷰에 기본적인 내용을 표시하는데 있어 UITableViewDatasource 프로토콜은 매우 중요한 메소드를 포함한다.

 - 필수적인 메소드

   -(NSInteger)numberOfSectionsInTableView:(UITableView*)TableView

     테이블뷰에 몇개의 섹션이 있는지 리턴

   -(NSInteger)tableView:(UITableView*)TableViewnumberOfRowsInSection:

    (NSInteger)section

      각 섹션별로 몇개의 로우를 준비할지 리턴

   -(UITableViewCell*)tableView:(UITableView*)TableViewcellForRowAtIndexPath:

    (NSIndexPath*)indexPath

     각각의 색션에 있는 로우자리에 들어갈 테이블셀을 구성해서 리턴

> NSIndexPath : 테이블 뷰의 각 로우를 지정하는데 사용되는 오브젝트

                          테이블뷰의 위치를 지정하는데 사용하기 위해 확장되었으며 섹션과 로우값을 가짐

                         .section과 .row를 통해 섹션과 로우를 알 수 있다.

> 재사용 큐

  테이블 뷰는 내용만 다를뿐 모양은 반복. (반복되는 뷰를 얼마나 잘 관리하느냐가 테이블 뷰의 퍼포먼스를 좌우하는 기본적인 요소)

-tableView:cellForRowAtIndexPath:

 테이블 뷰 셀을 만들어 리턴, 테이블 뷰의 내부에 있는 버퍼를 이용해 메모리를 효율적으로 사용흐는 기법이 사용

재사용 큐라고 부르는 버퍼는 스크롤되어 화면 밖으로 사라지는 테이블 셀을 임시로 지니고 있다. 화면 밖으로 사라지는 셀이 있으면 새롭게 추가되는 셀도 있을 것이다. 새로 뿌려져야 하는 셀을 만들기 전에 테이블 뷰는 재사용 큐를 먼저 살핀다. 재사용 큐에 새로 만들고자하는 테이블 셀과 동일한 형태의 셀이 있다면 새로 테이블 뷰 셀 오브젝트를 만들지 않고 이미 만들어져 있는 재사용 큐에 있는 테이블 뷰 셀에 값을 바꿔서 테이블 뷰에 넣어준다.

-----------------------------------------------------------------------------------------

저는 좀 융통성이 없기 때문에- 물론 다들 검색 잘하셨겠지만.

좋은 블로그, 카페 알려드릴께요.

http://blog.naver.com/yooninsung?Redirect=Log&logNo=30085373382

http://blog.naver.com/philipousys/130074327578

http://blog.naver.com/warlord0916?Redirect=Log&logNo=90083710091

http://theeye.pe.kr/entry/iPhone-Object-C-Declared-Properties

제 블로그보고 짜증내지 마시고;;; 여기 가보세요ㅋ

--------------------------------------------------------------------

Chapter 4하면서 ㅠㅠ 어려웠던 부분

확신이 가지 않음ㅠㅠ(제대로 공부한지 2틀..3일..됨)ㅠㅠ

 // setter 메소드

-(void) setCandleOffImage:(UIImage*)newImage

{

   UIImage *oldImage = candleOffImage;

    // candleOffImage's retain is 1

   if(oldImage != newImage)

   {

        candleOffImage = [newImage retain];

        // newImage's retain is 1

        if(oldImage != nil) [oldImage release];

      // candleOffImage's retain is 0

    }

    // if가 참일때.  candleOffImage's retain is 1

    //  if가 거짓일때, newImage's retain is 1

}

일단 setter메소드를 보면..(맨첨엔 무작정봤는데ㅠ)

어느 인스턴스변수에 저장하려고 호출하였는지 파악해야..합니다.(당연..)

변수이름을 보니 candleOffImage(UIImage) 인스턴스변수에 저장하려고 하는거죠?

따라서 candleOffImage변수에 뭔가가 저장되어야 합니다.(바른말로 가리켜야 하죠;)

근데 우리가 candleOffImage에 알맞은 이미지가 저장되어 있는지 모릅니다.

그래서 일단 지역변수(?ㅠ)에 저장시켜 둡니다.

그리고 if()문에서 candleOffImage변수가(oldImage변수가 가리키고 있음) newImage변수가 같은지 확인합니다.

만약 같으면 맞게 저장되어 있는것이므로 더이상 candleOffImage에 이미지를 저장하지 않아도 됩니다.

만약 다르면!

새 이미지(newImage)를 candleOffImage변수가 저장시켜주고

잘못된 이미지를 가리키고 있는 oldImage변수를 release시켜줍니다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=36
Posted by 오늘마감
아이폰 어플 , 가속도 센서에 대한 정리

가속 센서를 이용한 시장 리뷰  http://mobizen.pe.kr/836

............................................................................................................................................................................................

아이폰 기기를 포트레이트모드(일반켰을때 모드인듯.)로 정면을 바라보고 있으면 가속도 센서는 -y방향으로 1, 아이폰을 책상 위에 올려두면 -z방향으로 1의 값을 가짐

가속도 센서가 값을 넘겨주는 주기는 우리가 결정가능

최대 1초에 10번~100번가능,

애플리케이션에 가해지는 부하때문에 유틸리티 같은 애플리케이션에서는 20번을 넘지 않도록 함

만약 게임같이 많이 사용하는 경우라도 60번을 넘지않도록 해야함.

>> 가속도 센서의 값을 이용하는 클래스들

1. UIDevice

UIDevice클래스를 이용하면 아이폰 기기에 대해 싱글톤 접근을 할수 있음

(싱클톤 : 해당 어플리케이션 내에서 유일한 하나의 객체임을 보증하기 위한 방법

    - 목적 : 객체를 하나면 만들기 위해

               프로젝트파일에서 모두 공유하기 위해

    - 장점 : 전역변수를 사용하는 것보다 위험성이 적음, 객체가 두번 이상 생성되는

               실수도 자동 방어)

기기 방향의 변경을 알려주는 노티피케이션 제공

( 노티피케이션 : 오브젝트가 멀리 떨어져 있어 서로 알지 못하는 경우 유용하게 사용

   노티피케이션 센터 : 애플리케이션 내에 유일한 오브젝트(싱글톤 객체)

                            오브젝트 내의 어느 곳에서 접근하더라도 동일한 노티피케이션 센터에

                            접근하게 됨.

                            노트피케이션 센터에 자신이 관심을 가지는 메시지가 올라오는지 지켜

                            보는 오브젝트가 있으며 노티피케이션 센터에 메시지를 올리는 오브젝트

                            존재, 특정 메시지가 올라오면 그 메시지에 관심이 있는

                           오브젝트로 메시지가 전달되며 각자 할일 수행)

아래 코딩은 호출을 통해 디바이스의 방향 전환에 대한 노티피케이션을 받겠다고 선언

[[UIDevice currentDevice] beginGeneratingDeviceOrientatonNotifications];

노티피케이션 센터 리턴하는 코딩

[NSNotificationCenter defaultCenter];

노티피케이션 센터에 통지 올리기

AAA라는 이름의 통지 올리기

아래 코딩을 사용하면 노티피케이션 센터에 통지가 올라갈 뿐만 아니라

통지를 받겠다고 등록한 모든 오브젝트에 메시지가 전달

[[NSNotificationCenter defaultCenter[postNotificationName:

@"AAA" object:self userInfo:nil];

object는 노티피케이션에 함께 동봉되는 오브젝트, 오브젝트 안에 self를 넘기는 이유는 노티피케이션을 받는 쪽에서 필요하면 사용할 수 있도록 함.

userInfo는 우리가 임의의 항목을 만들어서 구독받는 오브젝트에 알릴 수 있도록 함.

또한 임의의 데이터를 패키징하는 딕셔너리,

예) 현재 시각값을 가지는 NSDate 오브젝트를 @"nowDate"라는 키와 쌍을 이뤄

딕셔너리에 넣어준 뒤 보내면 노티피케이션을 구독하는 쪽에서 필요에 따라 그 값을 읽어서 사용

할수 있음.

노티피케이션 센터에 자기 자신을 관찰자로 등록하는 내용

AAA라는 이름의 통지가 올라오면 내가 -addBBB:라는 메소드를 실행시키겠다는 의미

[[NSNotificationCenter dafaultCenter] addObserver:self

selector:@selector(addBBB:) name:@"AAA" object:nil];

UIDevice에서 사용하는 노티피케이션 발행

UIDeviceOrientationDidChangNotification - 디바이스의 현재 방향

(기기의 방향이 바뀌었다는 통지가 날라오면 UIDevice클래스로부터 orientation

프라퍼티를 읽어서 방향 변화에 대한 처리를 함)

UIDeviceBatteryLevelDidChangeNotification - 배터리의 레벨이 변함

디바이스 방향이 더 이상 필요 없을 경우엔

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

호출을 통해 가속도 센서의 이용을 끝내야함.

(가속도 센서를 전원을 많이 소모하는 장치임)

2. UIApplication

애플리케이션에 대한 싱글톤 접근 가능

스테이터스 바(status bar)의 방향을 설정 할 수 있는

statusBarOrientation 프라퍼티 제공

3. UIViewController

이 클래스는 interfaceOrientation프라퍼티를 가지고 있으며

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

메소드를 오버라이드해서 뷰 컨트롤러가 관리하는 뷰가 디바이스의 변화에 대응할지를 YEs나

NO값으로 리턴함

4. UIResponder

터치이벤트가 시작되는 클래스

motion이벤트 : 아이폰의 움직임에 대해 이벤트를 발생시키는 모션.

                    아이폰 3.0에서는 쉐이크밖에 제공하고 있지 않음.

5. UIAcceleometer

가속도 센서에 대한 싱글톤 접근 제공

 UIAccelerometer* theAccel = [UIAccelerometer sharedAccelerometer];

theAccel.updateInterval = 1/30;

theAccel.delegate = self;

+sharedAccelerometer 메소드로 가속도 센서에 접근

1초에 30번 가속도 센서의 값을 전달받겠다고 설정

theAccel의 델리게이트를 self로 지정하면 델리게이트 프로토콜 메소드를 구현해야 함.

 -(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration

{

   // 이벤트 데이터 얻어온다.

   UIAccelerationValue x,y,z;

   x = acceleration.x;

   y = acceleration.y;

   z = acceleration.z;

   // 데이터 처리 코드가 이어져야 한다.

}

UIAccelerameter 오브젝트는 싱글톤이므로 유일한 객체,

따라서 델리게이트메소드 역시 하나만 지정

따라서 하나의 애플리케이션에는 하나의 델리게이트 메소드 역시 하나.

UIAcclerationValue의 값은 double이며, 1이 1g(중력값)을 나타냄

- 하이패스 필터(high pass filter)

 아이폰이 항상 받고 있는 중력값을 필터링해서 없애버리고 움직임만을 얻어내는 기법.

아이폰이 중력에 대해 어떤 상태로 있든 상관없이 저지해있기만 하면

x,y,z값은 0으로 설정하고 움직이는 방향에 대한 값만을 제공하는 것.

  UIAccelerationValue acceleration[3];

 UIAcclerationValue history[kHistorySize][3];

 // 하이패스 필터 기능을 켰는지 점검

 if(filteringIsEnable){

     accleraion[0] = x*kFilteringFactor + acceleration[0]*(1.0-                            kFilteringFactor);

     history[nextIndex][0] = x-accleration[0];

    accleraion[1] = x*kFilteringFactor + acceleration[1]*(1.0-                            kFilteringFactor);

     history[nextIndex][1] = x-accleration[1];

    accleraion[2] = x*kFilteringFactor + acceleration[2]*(1.0-                          kFilteringFactor);

     history[nextIndex][2] = x-accleration[2];

  } else {

     history[nextIndex][0] = x;

     history[nextIndex][1]  = y;

     history[nextIndex][2] = z;

  }

 kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

그래프는 histroy배열에 값에 의해 그려지며 history는 최근 3개의 x,y,z값을 가진다.

acceleration배열은 현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.

그리고 그 값을 다시 현재 가속도 센서의 x값에서 뺀 값을 이용해 움직임에 대한 수치만 history에 넣어서 그래프를 그리는데 사용

-로우패스 필터

미세한 움직임을 필터링하고 중력값을 주로 이용하기 위해 가속도 센서의 값을 가공

즉, 가속센서의 그래프에서 많이 튀는것은 하이패스필터로 잡고

작게 튀는것은 로우패스 필터로 잡는다.

  UIAccelerationValue accel[3];

 accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 -                      kFilteringFactor);

accel[1] = acceleration.x * kFilteringFactor + accel[1] * (1.0 -                      kFilteringFactor);

accel[2] = acceleration.x * kFilteringFactor + accel[2] * (1.0 -                      kFilteringFactor);

kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=30
Posted by 오늘마감
아이폰 어플에 동적으로 이미지,동영상 만드는 방법 정리

#import "ImagesViewController.h"

#import "Constants.h"

#define kMinDuration 0.0

#define kMaxDuration 10.0

@implementation ImagesViewController

@synthesize imageView, slider;

- (void)dealloc

{

[imageViewrelease];

[sliderrelease];

[superdealloc];

}

- (void)viewDidLoad

{

[superviewDidLoad];

self.title = NSLocalizedString(@"ImagesTitle", @"");

// set up our UIImage with a group or array of images to animate (or in our case a slideshow)

UIImage *im5 = [[UIImagealloc] initWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"scene1"ofType:@"jpg"]]; 

UIImage *im1=[[UIImagealloc] initWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"scene2"ofType:@"jpg"]];

UIImage *im2=[[UIImagealloc] initWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"scene3"ofType:@"jpg"]];

UIImage *im3=[[UIImagealloc] initWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"scene4"ofType:@"jpg"]];

UIImage *im4=[[UIImagealloc] initWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"scene5"ofType:@"jpg"]];

NSMutableArray *ma=[[NSMutableArrayalloc]init];

[ma addObject:im1];

[ma addObject:im2];

[ma addObject:im3];

[ma addObject:im4];

[ma addObject:im5];

NSArray *arry=ma;

self.imageView.animationImages =arry;

//정적으로 동영상 만드는 방식

//self.imageView.animationImages = [NSArray arrayWithObjects:

//[UIImage imageNamed:@"scene1.jpg"],

//[UIImage imageNamed:@"scene2.jpg"],

//[UIImage imageNamed:@"scene3.jpg"],

//[UIImage imageNamed:@"scene4.jpg"],

//[UIImage imageNamed:@"scene5.jpg"],

//  nil];

imageView.animationDuration = 5.0;

[self.imageViewstopAnimating];

// Set the appropriate accessibility labels.

[self.imageViewsetIsAccessibilityElement:YES];

[self.imageViewsetAccessibilityLabel:self.title];

[self.slidersetAccessibilityLabel:NSLocalizedString(@"DurationSlider",@"")];

}

// called after the view controller's view is released and set to nil.

// For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc.

// So release any properties that are loaded in viewDidLoad or can be recreated lazily.

//

- (void)viewDidUnload

{

[superviewDidUnload];

self.imageView = nil;

self.slider = nil;

}

// slown down or speed up the slide show as the slider is moved

- (IBAction)sliderAction:(id)sender

{

UISlider* durationSlider = sender;

self.imageView.animationDuration = [durationSlider value];

if (!self.imageView.isAnimating)

[self.imageViewstartAnimating];

}

#pragma mark -

#pragma mark UIViewController delegate methods

// called after this controller's view was dismissed, covered or otherwise hidden

- (void)viewWillDisappear:(BOOL)animated

{

[self.imageViewstopAnimating];

// restore the nav bar and status bar color to default

self.navigationController.navigationBar.barStyle = UIBarStyleDefault;

[UIApplicationsharedApplication].statusBarStyle = UIStatusBarStyleDefault;

}

// called after this controller's view will appear

- (void)viewWillAppear:(BOOL)animated

{

[self.imageViewstartAnimating];

// for aesthetic reasons (the background is black), make the nav bar black for this particular page

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

// match the status bar with the nav bar

[UIApplicationsharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque;

}

@end



출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=14
Posted by 오늘마감
아이폰 어플 개발에서 TableView 넣는 방법 간단 정리

1. UIView 밑에 TableView 생성


2. TableView 클릭 + 컨트롤키누르고 file's owner로 드래그 datasource,delegate 2개 클릭


3. 필수함수인 2개를 코딩



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *cIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cIdentifier];

if(cell == nil){

cell = [[[UITableViewCellalloc]

initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cIdentifier]

autorelease];

}

cell.textLabel.text = @"table";

return cell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return5;

}




출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=49
Posted by 오늘마감
UIView의 구조를 이미지 1장에 깔끔하게 정리



출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=6
Posted by 오늘마감
아이폰 OS의 개요, 기술 레이어, 코딩법 등등 정리

원문은 Getting Started의 iPhone OS Overview 입니다.

<차례>

1.iPhone OS 개요
2.iPhone OS 기술 레이어

3.iPhone OS에서의 코딩

4.어디서부터 시작해야 하나

1.iPhone OS 개요 +-----+-----+-----+-----+-----+


IPhone OS는 Mac OS X의 많은 부분을 바탕으로 만들어져 있지만 모바일 환경에 맞는 독자의 기능(멀티터치, 가속도 센서 등)
또한 제공하고 있다.


iPhone SDK는 코드와 정보, 개발툴, 테스트/디버깅/실행/튜닝 환경을 포함하고 있으며
Xcode툴은 iPhone OS개발을 서포트하기 위해 업데이트 되어왔다.


2.iPhone OS 기술 레이어 +-----+-----+-----+-----+-----+


■ Core OS / Core Services


iPhone OS를 위한 기본 인터페이스(파일 억세스, 하위레벨 데이터타입, Bonjour서비스, 네트워크 소켓 등)를 제공.
이 인터페이스들은 대부분 C로 구현되어 있으며 Core Foundation, CFNetwork, SQLite, POSIX 스레드 접근, UNIX 소켓 등의 기술을 포함한다.


■ Media


이 레이어는 C와 Objective-c의 혼합으로 구현되어 있으며 2D / 3D / audio / video 를 서포트하는 기술을 제공한다.
이 중 C를 기반으로 한 기술은 OpenGL ES, Quartz, Core Audio이며 Objective-c는 애니매이션 엔진인 Core Animation을 제공한다.


■ Cocoa Touch


대부분이 Objective-C로 구현되어 있으며 유저 어플리케이션 개발에 있어서 기반이 되는 기술이다.
예를 들면, 기본 프레임워크는 컬렉션의 객체지향, 파일 관리, 네트워크 조작등을 제공한다.
UIKit 프레임워크는 유저 어플리케이션의 비쥬얼 기반(윈도, 뷰, 컨트롤, 그리고 이 오브젝트들을 제어하는 컨트롤러 등)을 제공한다.
또한 이 레이어의 다른 프레임워크들은 연락처, 사진첩, 다른 하드웨어 디바이스의 접근등을 제공한다.


이 레이어가 바로 개발자의 스타트 포인트이며 추천하고 있는 지점이다.
상위 레벨의 프레임워크는 최소의 노력으로 최대의 효과를 얻을 수 있게 작성되어 있으며
개발자가 하위 레벨 기술의 사용을 고려해야 할 때는 오직 상위 레이어가 제공하지 않는 부분을 커버해야 할 때이다.


 

3.iPhone OS에서의 코딩 +-----+-----+-----+-----+-----+


iPhone SDK는 iPhone OS에서 네이티브하게 움직이는 어플리케이션을 작성하게 해준다.
어플리케이션은 유저의 홈 스크린에 상주하며 실행후에는 몇몇 데몬과 커널을 제외하고는 유일하게 실행되고 있는 어플리케이션이 된다.
이는 자원의 풀 억세스를 가능하게 하며 내장하드웨어(기속도 센서, 카메라, 화면등)에 접근하여 실행시킬수 있다.


iPhone 어플리케이션을 사용하는 유저들은 매우 직관적으로 필요한 기능을 판단하길 원함으로 개발자는 그 점을 잘 고려하여 설계하는것이 좋다.


일단 UIKit에 정통하라. 그 후에 다른 기술을 알아 나가는 것이 더 좋다.
각 프레임워크에 대한 문서들은 그 후에 알아 나가야 할 관련 기술에 대한 정보를 제공하고 있다.


<영문 링크>
기본 프레임워크
UIKit 프레임워크


4.어디서부터 시작해야 하나 +-----+-----+-----+-----+-----+


iPhone OS에서 돌아가는 아주 간단한 프로그램을 만들기란 너무 쉽다. 그냥 Xcode의 템플렛에서 만들어보면 된다.
하지만 제대로 된 유용한 어플리케이션을 만들고 싶다면 어느정도 시간을 투자하여 문서를 읽어 볼 필요가 있다.


■ iPhone OS나 Mac OS X 를 처음 접하는 사람이라면


기본 프레임워크로부터 공부한다면 좀 더 시간이 걸린다. 시작은 iPhone OS의 디자인 패턴으로 하자.
문서명은 Cocoa Fundamentals Guide 이며 이는 Objective-C, UIKit의 디자인패턴과 그 외 시스템 디자인 패턴을 포함한다.

■ iPhone 어플리케이션에 어느정도 익숙하다면


특정 기술을 참조하기 위하여 iPhone Application Programming Guide 를 읽자.
특정 기술을 어떻게 사용하여야 하는지, 코딩 예제와 iPhone OS의 특징을 살리는 방법등이 나와있다.
또한 Xcode사용법과 전체 개발 프로세스에 대한 설명도 나와있다.


이 문서에는 풀 코드가 들어있는 샘플도 많이 포함되어 있는데 이는 실제 어플리케이션이므로 이를 다운받아 공부하는 것도 매우 좋은 방법이다.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075714146
Posted by 오늘마감
아이폰기본사용2010.08.26 07:57

6월 19일 아이폰(iPhone) 3GS가 미국을 비롯한 유럽 몇 개국에서 정시 발매를 시작했습니다. 정식 출시되기 전에 이미 3GS 사진이 유출되기도 했었습니다. 그런데 이번에는 출시된 지 만 하루가 지나기도 전에 3GS 전체 분해 과정이 사진과 함께 자세히 올라왔습니다. 분해 과정 설명도 비교적 자세하게 잘 해 놓았습니다. 분해 과정을 설명해 놓은 곳은 Rapidrepair 라는 애플 제품 및 ZUNE, XBOX, 플레이스테이션, 닌텐도 전문 수리 사이트입니다. 영문 설명과 함께 보다 자세한 분해 과정을 보시려면 이곳 을 클릭해 주세요. ^^




#1 - LCD 스크린, #2 - 디지털 변환 장치, #3 - 이어(Ear) 스피커, #5 - 헤드폰 잭, #6 - 무선 
P.S. #3 번은 #1번과 #2번 아래에 숨어 있다. 



이것이 배터리입니다. 배터리의 지속 시간을 문제삼는 사람들이 많아서 크기가 많이 작을 줄 알았는데 생각보다 많이 작지는 않네요.  
배터리 정보는 다음과 같습니다. 
APN: 616-0434
VPN: APPLE-08-003-01(GG)
Li-ion Polymer Battery: 3.7V 4.51Whr


드디어 완전히 다 분해한 모습입니다. 

왼쪽이 3GS, 오른쪽이 3G 시스템 보드이다. 

사진만 봐도 엄청 복잡하네요. 저를 비롯한 보통 사람들은 분해 엄두도 못낼 정도로 복잡해 보입니다. 

CPU - Samsung
339S0073ARM
K2132C2P0-50-F
0N1480911
APL0298
N1TVY0Q 0919

NAND Flash Memory - Toshiba TH58NVG702ELA89
IA8816
TAIWAN
09209AE

System Memory - 337S3754
CMA
G0919
5Y9307885E4

Infineon - 36MY1EE
A9177314
Z171033B

iPhone 3G S                           Palm Pre CPU Samsung S5PC100 Texas Instruments OMAP 3430 ARM Cortex A8 600 MHz, PowerVR SGX graphics ARM Cortex A8 600MHZ, PowerVR SGX 530 (GPU), 430MHz C64x, DSP and ISP (Image Signal Processor) Baseband Processor Updating soon Qualcomm MSM6801A Storage Internal 16/32 GB Internal 8 GB Memory 256 MB RAM 256MB DDR2  LCD 3.5-inch 480-by-320-pixel at 163 ppi Multi-Touch display 3.1-inch 480-by-320-pixel Multi-Touch display Connectivity
UMTS/HSDPA (850, 1900, 2100 MHz)
UMTS/HSDPA (1900, 2100 MHz) GSM/EDGE (850, 900, 1800, 1900 MHz) GSM/EDGE (850, 900, 1800, 1900 MHz)


iPhone 2G iPhone 3G iPhone 3G S Palm Pre CPU Baseband Processor Storage Memory LCD Battery Connectivity Size Camera 
 


출처 : http://blog.naver.com/PostView.nhn?blogId=baek2187&logNo=150074791078
Posted by 오늘마감
아이폰개발자 등록과 아이폰 개발자 라이센스 만드는 절차 정리

원문 : http://tory45.egloos.com/5225109

iPhone App를 개발한답시고 iPhone 2G를 회사에서 하나 받고 무작정 개발해보았다... 개발 방법론과 개발 툴에 대한 개인적인 견해는 정말 환상적었지만 개발 환경에 대한 개인적인 견해는 그리 좋은 평을 하고 싶지는 않다...
뭐랄까? 전세계 소프트웨어 개발자들에게 iPhone App를 개발하기 위해선 싫든 좋든 그들을 충실히 따르는 Third party가 되어야 한다는 無言의 압박을 가하고 있다는 느낌마저 들게 하는데

그 단적인 예로로
  첫번째, iPhone App를 개발하기 위해서는 무조건 Mac PC가 필요하다는것
  두번째, 개발에 사용되는 Mac PC, iPhone, Application, 심지어 개발자까지 돈을 지불해 가며 승인을 거쳐야
             iPhone Device에서 직접 테스트 할수 있다는 것이다...

            참고로 모든 라이센스는 1년동안 유효하고 개인이나 소규모 법인들이 사용하는 Standard는 99달러 , 
                      대규모 법인( 500명 이상 )는 255달러를 지불해야 한다. 
                      라이센스를 받지 않고서는 iPhone Device를 가지조 직접 테스트 할수도 없고 App Store에 등록도 하지 못한다. 

지금까지 개인용 PC OS 의 독점 업체로 MS가 횡포를 부렸다면 앞으로는 스마트폰 OS 독점 업체로 애플이 횡포를 부릴지 않을까라는 우려심이 살짝 들기도 하고 이런 변화무쌍한 무한 경쟁시대에서 살아 남기 위해 발버둥 치는 소프트웨어 엔지니어의 고충을 생각하면 서글프기 짝이 없다...

자.. 용기를 내서 한번 iPhone을 한번 쑤셔 보자...

순서는 1, 개발자 등록 및 라이센스 계약하기 , 2, Sample iPhone App 개발, 3, xcode 시뮬레이터로 테스트 하기 , 4, iPhone Device에서 테스트하기 로 진행하겠다

1. 개발자 등록 및 라이센스 계약 하기
   준비사항 : 
                  공통 : Mac PC, 신용카드(Visa)
                  법인:  영문 사업자 등록증, 법적 책임자 정보

                  주의 사항 : 신청자의 영문 이름이 결제 카드의 영문이름과 동일해야 한다 
                                  법인 신청시 영문 사업자 등록증과 토시 하나 틀리면 안된다

    - 개발자 등록 사이트 접속(http://developer.apple.com/programs/register/)


         - 상단 ( Get Started ) 클릭

             * Create ApplD : 새로운 ID 생성
             * Use an existing Apple ID : 이미 만들어진 ID 사용
             * 여기서는 새로운 ID 생성을 선택하고 Continue 버튼을 클릭 

          *주소랑 메일은 정확히 기재해야함

           * 이것 저것 개인정보 넣고 Continue

          * 동의하고 I Agree 클릭(클릭하는 순간 기재한 메일로 Verification Code가 날라 갑니다. )

           * 앞 단계에서 입력한 메일주소로 Verification( 확인서 )가 보내졌을거구 그 메일에 보면 확인 코드가 있는데..
             그 코드를 빈 박스에 복사해서 넣구 Continue
           * 여기서 주의 할것은 iPhone에서 보내는 메일은 모두 영문으로  날라 오기때문에 스팸메일로 빠질수 있으니 
             스펨 메일함도 체크....

           - 메일 내용 -

                * 메일에서 부여 받은 확인서 코드 "28961" 를 복사해서 붙혀 넣고 Continue.. ^^

           * 뭐.. 이제 등록 되었으니 ...아이디랑 패스워드로 로그인 하면 여러가지 지원을 받을 수 있다... 정도로 해석하면 될듯하고
              Continue 클릭

           이제 개발자 등록 되었으니 실제로 SDK를 구입해야 할차례...

            * 오른쪽 상단 "Join the Developer Programs 메뉴의 "Join Today" 클릭



           * Contine ( iPhone SDK로 개발하기 위해선 Mac OS X Leopard나 그 이후 버전이 필요하다라고 되어 있군.. 도둑놈들..)

           * 좀전에 개발자 ID는 등록 했고 프로그램 사용에 대한 등록만 하면 되니.. "New Apple Developer" 에 enrollment 항목
             에 체크하고 Continue

            * 여기서 개인으로 등록할거야 법인으로 등록할거냐.. 선택...

              법인 선택 시 영문 사업자 등록증에 기재된 내용과 똑같이 기재해야 하고
              회사 대표 전화번호, 법적 책임자 정보를 기재하는 화면이 개인 신청에 비해 추가된 화면임
              영문 사업자 등록증을 팩스로 보내 달라는 전화가 옴.

            "Company" 클릭 시 화면 


              여기서는 개인으로 신청할거니깐.. "Individual" 버튼에 클릭

          *결제 카드에 적힌 이름을 넣어달라구 하구 주소랑 전화번호는 똑바로 기재 해 달라고 하고..
  요거 잘못 기재하면 승인 안납니다...

          * iPhone SDK를 구입할건지 Mac SDK를 구입할건지 체크 

         *입력한 내용 한번 더 확인 해주고...

          * License 동의하고

         *"Add to cart" 클릭하면 결제 창이 나오고 결제하기 버튼 크릭하면됨

          * 결제하는것으로 끝이 납니다..

* 하지만 여기서 끝이 아니라는거......
          결제가 되더라도 바로 iPhone Device를 테스트 할 수 없습니다. 

          결제가 된 후 승인에 이르기까지 iPhone에서 몇번의 메일과 필요에 따라 전화가 올수 있습니다. 
          물론 전화는 한국 사람이 합니다..^^

          법인일 경우 법적 책임자에게 전화가 오고 또 영문 사업자 등록증을 팩스로 보내 달라는 메일도 날라 옵니다. 

          그때 지시에 따라 찬찬히 수용하시면 iPhone Device로 테스트 할수 있는 첫번째 과정이 끝납니다. 

          다음 강좌에서는 개발자 등록 승인이 이루어지고 난뒤 어떻게 iPhone Device로 테스트 할수 있는지 알아보도록 하지요...



출처 : http://blog.naver.com/PostView.nhn?blogId=74hans&logNo=109928746
Posted by 오늘마감