'맥프로그래밍'에 해당되는 글 9건

  1. 2009.06.06 Objective-C : Object Initialization
반응형
1. Object Initialization
Object 생성을 위해서는 [SomeClass new] 를 이용하거나 [[SomeClass alloc] init] 을 사용한다. Cocoa에서는 new보다는 alloc -> init을 사용하기를 권장한다.

[SomeClass alloc] 을 하게 되면 운영체제로 부터 그 object의 instance 변수들을 유지하기에 충분한 메모리를 할당 받는다. 메모리를 할당 받으며 0 으로 초기화 된다. (BOOL은 NO로, float, int는 0으로, pointer는 nil로)

SomeClass *classPtr = [[SomeClass alloc] init]; 형태로 사용되며 다음과 같이 사용 되지 않는다

SomeClass *classPtr=[SomeClass alloc];
[classPtr init];

그 이유는 init에 의해서 리턴되는 Object는 alloc 된것과는 다를수 있기 때문이다. init 에 의해서 리턴되는 Object가 alloc 된것과 다른 이유는 init 메소드에 파라미터를 받아서 적절한 객체를 선택하기 위해서다. 

init 메소드를 override 하기 위해서는 다음과 같은 코드를 사용한다.

-(id) init
{
if (self = [super init]) {
Some codes for initialization...
}
return (self);
}

여기에서 [super init]은 super class를 initialization 하기 위해서 사용되며 앞에서 이야기 한 것과 탁이 init 시에 리턴되는 object는 달라질수 있기 때문에 self 포인터를 update 하였다. (self = [super init])

init 이 실패하게 되면 nil 을 리턴한다.

2. Convenience initializers
initializer는 확장이 가능하다. 이를 "Convenience initializers"라고 한다. 예를 들어  NSString의 경우

-(id) initWithFormat: (NSString *) format, ...;
-(id) initWithContentsOfFile: (NSString *) path;

등의 확장된 initializers들을 가지고 있다.

initializer에서 객체를 할당(alloc->init)하고 초기화 할수 있다. 이때 initializer에서 생성한 객체들은 앞에서 설명한 cocoa의 memory management 룰에 따라 dealloc 메소드에서 clean-up 해주어야 한다. 물론 이때 garbage collection 기능을 사용한다면 객체를 가르키는 pointer를 제거해 주면 된다. GC에서는 dealloc는 의미가 없으며 object가 collect 될때 호출되는 -finalize 를 오버라이드 해야 한다.

3. Designated Initializer
여러 Convenience intializer들을 가지고 어느 클래스를 상속하는 Subclass에서 부모 클래스를 초기화 할 경우에 어떤 initializer를 사용해야 할지 결정을 해야 한다. "Designated Initializer"는 initialier중에서 가장 많은 argument를 받는 initializer이다. Cocoa에서는 Desinated initializer를 subclass에서 부모 클래스를 초기화 할때 사용하도록 권하고 있다.





반응형
Posted by alias
,