When my custom initializer fails, I am supposed to return nil. What is the convention for cleaning up any memory I’ve allocated in my initializer, that I was expecting would be cleaned up in dealloc?
Here is a contrived example:
- (id)init
{
if ((self = [super init])) {
instanceVar1 = [[NSString alloc] initWithString:@"blah"];
if (bad_thing_oh_noes) {
return nil;
}
}
return self;
}
- (void)dealloc
{
[instanceVar1 release];
[super dealloc];
}
A more realistic circumstance where I can’t efficiently check every error condition before I do allocations would be deserializing a complex object containing arrays and the like.
Anyway, do I clean up the allocated memory before returning nil, do I send a dealloc message to self before returning nil, or is all of this managed for me magically?
If an error occurs during an initializer, you should call
releaseonselfand returnnil.Also, you must make sure that it is safe to call
deallocon a partially initialized object.You should call
releaseonly at the point of failure. If you getnilback from the superclass’s initializer, you should not callrelease.Normally, you should not throw an exception upon initialization failure.
An example from Handling Initialization Failure: