반응형
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에서 부모 클래스를 초기화 할때 사용하도록 권하고 있다.
반응형