Should I always release self when there is a failure inside init, or should I only do so if I have initialized instance variables first?
To put it another way, is this pattern valid? Is there a time when I shouldn't release self inside an init method, or should I assume that if the control flow enters init, self has at least a retain count of 1?
- (id)init
{
if ((self = [super init]) == nil)
{
[self release];
return nil;
}
//do some init stuff
if (somethingFailed)
{
[self release];
return nil;
}
return self;
}
If some check you need in your initialization method fails, then yes you should release self
. Note however, that if [super init]
returns nil
it does not make sense to send release to self
as self
is nil
. This is actually frowned on by Apple:
You should only call
[self release]
at the point of failure. If you getnil
back from an invocation of the superclass’s initializer, you should not also callrelease
.
Example:
- (id)init
{
self = [super init];
if(self) {
// do some init stuff
if (somethingFailed)
{
[self release]
self = nil;
}
}
return self;
}
Also see the Mac Dev Center documentation on Handling Initialization Failure
来源:https://stackoverflow.com/questions/2467685/should-i-always-release-self-for-failed-init-methods