애플 개발자 사이트의 내용입니다

Touch 3G를 개발 기기로 사용하실경우 다음 작업을 해주세요.
* iPhone, iPhone 3G, iPhone 3GS, Touch, Touch 2G는 관련없습니다.

터미널에서 다음 명령문(한줄)을 칩니다.

ln -s /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1.1\ \(7C145\) /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1.1\ \(7C146\)


만약 SDK(및 개발툴, xCode)를 설치하신 경로가 다를경우 명령줄의 해당 경로를 수정해 주세요.




--- by 맥부기(문씨님)

Posted by 배고파씨
컴파일 시에 옵션 -fobjc-gc-only가 필요하다.

메소드 실행 중에 사용하는 객체는 메소드내의 자동 변수에 대입해서 사용 한다.

당분간 사용할 것 같은 객체는 외부 변수에서 참조 할 수 있도록 해둔다.

회수 대상이 되는 것은 id 타입이거나, 클래스명을 타입으로 사용하는 변수이다.

오너쉽과 인스턴스 변수에 대해 신경 쓰지 않아도 된다.

객체가 해제 될 때 필요한 후처리는 finalize 메소스에 기술할 수 있지만 가급적 사용 하지 않도록 한다.

레퍼런스 카운트 관련 메소드및 dealloc 메소드는 프로그램 안에 정의되어 있어도 실행되지 않는다.

Posted by 배고파씨
객체 중에는 해제 하면 안되는 객체도 있습니다.
예를 들어 클래스 객체(Objective-C에서는 클래스자체도 객체로 취급합니다. main 함수가 시작될때 인스턴스화 됩니다.)나 하나의 인스턴스만 만들어서 공유 하는 경우 혹은  NSString 문자열에 있는 것과 같은 객체 상수입니다.

이들 객체에 메세지 retainCount를 보내면 UINT_MAX라는 리턴값이 돌아 옵니다.
이것은 C언어 표준 라이브러리의 헤더 limits.h에서 정의된 unsigned int의 최대값 입니다.

해제 하면 안되는 객체를 정의 할 때는 클래스 정의에서 retain, release, 그리고 retainCount를 오버라이드 합니다.

구체적으로는 retain과 realease, autorealease가 아무것도 하지 않도록 오버라이드해서 레퍼런스 카운트 값이 변경 되지 않도록 합니다. 동시에 retainCount가 UINT_MAX를 리턴 하도록 만듭니다. 단 일반 적인 프로그램에서는 이렇게 정의 하는 일은 거의 없습니다.

하나의 인스턴스만 만들어서 사용하는 설계 방식을 디자인 패턴에서는 싱글톤 이라고 부릅니다. Cocoa 프레임워크에서도 이런 형태의 객체가 몇가지 있습니다. 예를 들어 애플리케이션을 제어하는 NSApplication의 객체 외에도 컬러 패널이나 프론트 패널도 하나의 객체가 공유 됩니다. 이들 클래스 에서는 shared...로 시작하는 클래스 메소드가 공유 되고 있는 유일한 인스턴스를 리턴 하도록 구현되어 있습니다.

Posted by 배고파씨
인스턴스 객체는 보통 클래스 메소드 alloc을 실행해서 만들고 init 같은 이니셜라이저로 초기화 합니다.
이렇게 만들어진 인스턴스의 레퍼런스 카운트는 1이되고, 그 인스턴스를 생성한 객체가 오너가 되어 이를 해제할 책임을 집니다.

한편 임시로 사용할 것을 전제로 해서 오너를 가지지 않고 만들어지는 인스턴스도 있습니다.
이러한 임시 인스턴스는 생성 직후에 자동 해제 풀에 등록하는 방법을 사용 합니다.

예를 들어 Cocoa 환경의 기본적인 클래스 중, 문자열을 표현하는 MSString이라는 클래스가 있습니다.
문자 코드가 유니코드(UTF-8)인 C 언어의 문자열에서 NSString 의 인스턴스를 생성하는 것이 가능한데 아래 두가지 메소드가 그 역할을 합니다.

- (id) initWithUTF8String(const char *) bytes
alloc으로 만들어진 인스턴스에 대한 이니셜라이저로, 만든 개체가 인스턴스의 오너가 됩니다.

- (id) stringWithUTF8String(const char *) bytes
임시 인스턴스를 만드는 클래스 메소드로, 결과로 리턴되는 인스턴스는 자동 해제 풀에 등록되어 있습니다.

이렇게 임시 인스턴스를 만드는 클래스 메소드를 가지는 클래스는 이것 외에도 여러가지가 있습니다.
이런 임시 인스턴스를 만드는 클래스 메소드는 alloc과 이니셜라이저를 조합해서 만드는 경우와 달리 호출한 쪽의 객체가 오너가 되지 않는다는 점에 주의 해야 합니다.

Objective-C에서는 임시 인스턴스를 간단하게 만드는 클래스 메소드를 컨비니언스 컨스트럭터라고 부릅니다.
전형적으로 alloc과 이니셜라이저, autorelease 메세지를 보내서 인스턴스를 리턴하는 형태의 클래스 메소드 입니다.


Posted by 배고파씨

오너쉽 정책

Objective-C 2009/08/07 23:24
오너쉽 정책(ownership policy)이란 인스턴스 객체의 오너가 그 인스턴스의 해제에 대해 책임 진다는 것 입니다.
오너쉽 정책은 프로그램 언어가 갖춘 메커니즘이나 기능이 아니라 개발을 할때의 관례와 같은 것으로 이 정책을 반드시 지키지 않아도 프로그램 개발이 가능 합니다. 다만 이 정책에 따라 프로그램을 개발 하면 동적으로 만들어진 인스턴스가 어느 객체에 의해 해제되는지를 명확하게 파악 할 수 있기 때문에 쉽게 분석할 수 있는 프로그램을 만들 수 있습니다.

alloc... 을 사용한 인스턴스 생성
 - 이 경우 메세지를 보낸객체가 생성된 인스턴스의 오너 입니다.

copy... 를 사용한 인스턴스의 복사
 - 이 경우 메세지를 보낸 객체가 복사된 인스턴스의 오너 입니다.

retain을 사용한 보존
 - 메세지를 보낸 객체가 리시버한 인스턴스의 오너 입니다.

인스턴스의 오너인 객체는 그 인스턴스 필요 없게 되었을 때 해제해야 할 책임이 있습니다.
구체적으로 release 혹은 autorelease 메세지를 보내서 오너쉽을 포기하는 것을 말합니다.
레퍼런스 카운트가 0이 되어 오너가 없어진 인스턴스는 그 시점에서 해제 됩니다.
거꾸로 인스턴스의 오너가 아닌 객체가 release나 autorelease 메세지를 보내는 것은 원칙적으로 금지되어 있습니다.

메세지의 인수로 객체를 전달 하거나 리턴값으로 객체를 전달 해야 할 경우가 있습니다. 이런 경우 오너쉽은 어떻게 처리 될까요?

메세지의 인수로 절달되든, 리턴값 형태이든 취급하는 방법은 동일하고 이 두가지 어느 경우도 오너쉽이 이동 하지는 않습니다.
단 인스턴스를 전달 받은 객체가 전달받은 인스턴스를 보존할지 여부는 그 메세지의 내용에 따라 자유롭게 결정 할 수 있습니다.
또 인스턴스를 전달 하는 쪽에서 인스턴스를 더이상 사용하지 않을 경우, 미리 autorelease 메세지를 보내 오너쉽을 포기한 후 전달 하기도 합니다. 이 두가지가 동시에 이루어 지면 결과적으로 오너쉽이 이동한 효과가 생깁니다.

그리고 한가지 주의할 점은 새로인스턴스를 만들어 자동변수에 대입하는 경우에는 메소드가 종료 하기 전에 오너쉽을 확실히 포기해야 합니다. 메소드가 종료되어 자동변수가 없어지면 나중에 그 인스턴스를 해제 하고 싶어도 못하기 때문입니다.

바로 아래의 예와 같은 경우 입니다.

- (id) temporaryValue
{
id tmp = [[ComplexData alloc] initWithData:myValue];
return [tmp autorelease];
}


Posted by 배고파씨
Cocoa 환경의 Objective-C에서는 인스턴스의 자동해제(autorelease) 기능이 제공됩니다.
이 기능은 해제할 인스턴스에게 매번 release 메세지를 보내서 해제 하지 않고, 해제 시킬 인스턴스를 메모지에 적어 두었다가
나중에 한번에 release메세지를 보내는 방법을 사용 합니다.

이때 메모지 역할을 하는 것이 NSAutoreleasePool 이라는 클래스 입니다.

이 메카니즘을 좀더 자세히 살펴보면 먼저 NSAutoreleasePool의 인스턴스를 하나 만듭니다. 이 인스턴스는 자동해제풀(autorelease pool) 이라고 부릅니다. 자동해제풀이 있는 상황에서 임의 인스턴스로 autorelease라는 메세지를 보내면
이 인스턴스가 자동해제풀에 등록 됩니다.
메모장에 적는 것이 이에 해당 합니다. 이시점에서는 아직 인스턴스가 해제된 것이 아니고 레퍼런스 카운트의 값도 변화가 없습니다.
이후 일련의 작업이 끝난 다음 자동해제풀을 해제하면 그때서야 비로서 자동해제풀에 등록 되어 있던 모든 인스턴스에 release 메세지를 보냅니다.

여기서 자동해제풀에 등록되어 사실상 오너쉽을 포기한 객체를 임시 객체라고 부르겠습니다.
자동해제풀의 전형적인 사용법은 아래와 같습니다.

id pool = [[NSAutoreleasePool alloc] init];

/* 여기서 부터 인련의 작업을 수행한다.
    임시객체에게 autorelease 메세지를 보낸다.
*/

[pool release]    /* 인스턴스는 여기서 해제 된다.  */



Posted by 배고파씨
박종암님께서 번역하신 한국어판 PDF 문서 입니다.

현재로서는 Objective-C 관련 자료 중에 한국어로 된 유일한 자료 입니다.

현재 버전이 비록 2.0 이기는 해도 이문서로 충분히 학습이 가능합니다.

이 문서를 보신 후 2.0 문서를 추가로 보시면서 변경되거나 추가된 부분만 학습 하셔도 충분 합니다.


Posted by 배고파씨