Double retaining with a retained property

A common mistake I see over and over again in code is the accidental double retain. This happens when an object is set to a property that has the attribute retain which results in a memory leak.

Let's look at an example of this happening:

@property (retain)  UIView *doubleRetainedView;
@property (retain)  UIView *singleRetainedView;
- (void) doubleRetainMethod
{
    self.doubleRetainedView = [[UIView alloc] init];
}

- (void) singleRetainMethodA
{
    self.singleRetainedView = [[[UIView alloc] init] autorelease];
}

- (void) singleRetainMethodB
{
    UIView *localView = [[UIView alloc] init];
    self.singleRetainedView = localView;
    [localView release];
}

- (void) dealloc
{
     [singleRetainedView release]; //retain count = 0
     singleRetainedView = nil;

     [doubleRetainedView release];//retain  count = 1
     doubleRetainedView = nil;

      [super dealloc];
}

In doubleRetainMethod we are double retaining doubleRetainedView as the alloc/init sequence increases its retain count to 1 and the attribute "retain" on the property increases its retain count to 2 so when we dealloc we are actually reducing doubleRetainedView's retain count to 1

In singleRetainMethod method we avoid this double retain but letting go of a retain either through the autorelease pool or by directly calling release.