2010-01-06 2 views
24

Objective-C에서 iPhone 용 새 클래스를 만들고 있다고 가정 해 보겠습니다. 내 init 메소드 중 하나에서 수동으로 메모리를 할당하려고합니다. 내가 청소하는 경우 몸 안에해야 할 일의은 calloc()는 메모리를 할당하지 못한 것은 내 개체에 대한 재앙이다, 그리고 그 실패 할 수 있다고 가정Objective-C에서 init : 메소드의 실패를 어떻게 처리해야합니까?

- (id)initWithSomeObject:(SomeObject *)someObject { 
    self = [super init]; 
    if (self != nil) { 
    myObject = someObject; 
    [myObject retain]; 
    if ((memory = calloc(1, sizeof(SomeStruct)) == NULL) { 
     // What should I do here to clean up 
     [self release]; 
     self = nil; 
    } 
    } 
    return self; 
} 

자 : 그래서, 나는 이런 식으로 뭔가를해야 할 수도 있습니다 제대로? Objective-C 관용구 또는 패턴을 사용해야합니까?

편집 : Rob Napier가 게시 한 코드가 포함되었습니다. 하지만 여전히 myObject를 릴리스해야합니다. 또는 추가 된 코드가 어떻게 든 dealloc()을 트리거합니까?

+2

dealloc()을 트리거하는지 여부에 대해 걱정하지 마십시오. 그것은 그렇습니다, 그러나 그것은 요점이 아닙니다. 핵심은 [self release]가 + alloc에 ​​대한 이전 호출의 균형을 유지하므로 필요한 릴리즈가 모두 완료되고 시스템이 적절한 시점에 할당 해제를 처리한다는 것입니다. 대부분의 경우, "적절한 시간"은 [자체 릴리스]가 호출되자 마자 가능할 것이지만 보류중인 자동 응답이 있으면 나중에있을 수 있습니다. 그러나 위의 코드는 정확하며 다른 것은 필요하지 않습니다. –

+0

메모 : calloc/malloc가 NULL을 반환하지 않는다는 것이 제 이해입니다. 메모리가 부족하거나 부족할 때 시스템이 응용 프로그램을 종료합니다. 애플은 그 일을하기가 더 쉽다고 생각하고, 앱이 확인되지 않은 NULL/nil 포인터를 쓰러 뜨리게 만들 것입니다. –

답변

26

예, 스스로 해제하고 nil을 반환해야합니다.

[self release]; 
self = nil; 

Objective-C 프로그래밍 개념의 가이드에서 Issues with Initializers을 참조하십시오.

3

필요한 항목을 정리 한 후 자체 참조를 nil으로 설정해야합니다. 난 그냥 시도

Link

+0

이런 - 적어도 downvote 때 의견을 남겨주세요! – psychotik

+0

자신을 해방하는 것을 잊지 마십시오. 그렇지 않으면 누출됩니다. (누구가 downvoted, 당신 말이 옳은지 전혀 모른다). –

1

: 애플 개발자 포털은 기사를 가지고있다. [self release]으로 인해 -dealloc이 호출되므로 myObjectinitWithSomeObject으로 출시 될 필요가 없습니다. 확실히, 당신은 myObject = [someObject retain]; (어떤 경우에는 -retain이 실패 할 수도있는 스타일을 선호합니다) 호출을 실패 할 수도 있습니다 (가능한 경우).