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()을 트리거합니까?
dealloc()을 트리거하는지 여부에 대해 걱정하지 마십시오. 그것은 그렇습니다, 그러나 그것은 요점이 아닙니다. 핵심은 [self release]가 + alloc에 대한 이전 호출의 균형을 유지하므로 필요한 릴리즈가 모두 완료되고 시스템이 적절한 시점에 할당 해제를 처리한다는 것입니다. 대부분의 경우, "적절한 시간"은 [자체 릴리스]가 호출되자 마자 가능할 것이지만 보류중인 자동 응답이 있으면 나중에있을 수 있습니다. 그러나 위의 코드는 정확하며 다른 것은 필요하지 않습니다. –
메모 : calloc/malloc가 NULL을 반환하지 않는다는 것이 제 이해입니다. 메모리가 부족하거나 부족할 때 시스템이 응용 프로그램을 종료합니다. 애플은 그 일을하기가 더 쉽다고 생각하고, 앱이 확인되지 않은 NULL/nil 포인터를 쓰러 뜨리게 만들 것입니다. –