Should I always release self for failed init methods?

cocoa, init, memory, objective-c

Solution

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 get `nil` back from an invocation of the superclass’s initializer, you should not also call `release`.

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

Problem

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; } ```

Original source