iphone - property - xcode documentation




Objective C 코드의 init에서 nil 반환 (2)

이 경우 init 메소드에서 nil을 반환하면 retain count와이 객체를 누가 공개 할 것입니까?

alloc (init 이전에 일어날 것입니다.)을 호출하자마자 retain count가 1이됩니다. 이제 init이 호출되어 어떤 이유로 객체를 초기화 할 수 없으므로 nil을 반환합니다.

그리고 retain count가 1 인 객체를 가지고 있고 아무도 release를 호출하기위한 참조를 가지고 있지 않은 것처럼 보입니다.

그런 경우에 init에서 [self autorelease]를 호출해야합니까? 아니면 다른 것을할까요?


보통, 당신은

self = [super init];
if (self == nil) {

   return nil;
}
// do some init job here
return self;

자아를 자동으로 내 놓는 것은 당신의 직업이 아닙니다. 자아를 가지고있을 때, 그것은 이미 아무 것도 아니므로, 비록 당신이 [self autorelease]; 라고 부르는 경우에도 [self autorelease]; , 그것은 아무것도하지 않습니다.

NSObject init 메서드는 이미 객체를 처리해야한다고 생각합니다.


설명서에서 객체 할당 및 초기화를 참조하십시오.

특히 이니셜 라이저에서 오류가 발생하면 selfrelease 하고 nil 반환합니다.

- init
{
    self = [super init];
    if (self) {
         if (... failed to initialize something in self ...) {
             [self release];
             return nil;
         }
    }
    return self;
}

이제 [super init] 을 호출 할 때 어떤 일이 일어나는지 고려해보고 nil 을 반환합니다. 위의 패턴은 이미 사용되었으며, self 가 릴리스되었으며, 반환이없는 경우 인스턴스가 사라 졌음을 나타냅니다. 누수가없고 모두가 행복합니다.

이는 또한 유효한 패턴입니다 ( selfMyClass 의 인스턴스라고 가정).

- init
{
    self = [super init];
    if (self) {
        ... normal initialization here ...
    } else {
        self = [MyClass genericInstanceWhenInitializationGoesBad];
        self = [self retain];
    }
    return self;
 }

init 는 ( +alloc 으로부터 연쇄되는 것을 암시하여) retained 되는 것을 반환 할 것이므로, [self retain] 은 구피처럼 보일지라도 실제로는 정확하다. MyClass 대체하면 이상한 일을 할 retain 있도록 self = [self retain] 이 추가 방어가됩니다.





objective-c