Let's say I'm building a new class for the iPhone in Objective-C. In one of my init methods I want to manually allocate some memory. So, I might have something like this:
- (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;
}
Now, assuming that the calloc() could fail, and that failing to allocate memory is catastrophic for my object, what should I do inside the if-body to clean up properly? Is there an Objective-C idiom or pattern that I should be using?
Edit: I included the code posted by Rob Napier. But, I still have to release myObject, right? Or does the added code somehow trigger dealloc()?
Yes, you should release yourself and then return nil
.
[self release];
self = nil;
See Issues with Initializers in the Concepts in Objective-C Programming guide.
You need to clean up anything you need to and then set the self reference to nil
. Apple Dev Portal has an article:
I just tried. -dealloc
gets called due to [self release]
, so myObject
would not need to get released in initWithSomeObject
. To be sure, you might move myObject = [someObject retain];
(I prefer that style in case -retain
might fail for some reason) below the call that might fail (if that's possible).
来源:https://stackoverflow.com/questions/2016795/how-should-i-handle-a-failure-in-an-init-method-in-objective-c