I have a property declared like this:
@property (nonatomic, retain) NSMutableArray *pricingLevels;
And I assign it like this:
Yep, you have a memory leak. Assigning to self.propertyName for a retained property automatically performs a retain. You either need to release the object after assigning (slightly more efficient to just do release
after assigning vs using autorelease
), or you need to assign the retained object to the instance field (sans self.
) not the property name, AND, for this latter case, you need to be sure that the instance field was previously nil (ie, only do the direct assignment in initialization logic).
(And don't forget your dealloc
method.)
(This all has nothing to do with the fact that the object happens to be an NSMutableArray.)
self.pricingLevels
is a property declared as retained
which means every time you set it thru property assignment (the dot-syntax OR the method), the object automatically retains the object for you.
self.pricingLevels = [NSMutableArray array];
[self setPricingLevels:[NSMutableArray array]];
The above code will do the same and automatically retain the array passed. This is what happens under the hood (or something similar). This method gets called:
- (void)setPricingLevels:(NSMutableArray *)a {
if(_pricingLevels != a) {
[_pricingLevels release];
_pricingLevels = [a retain];
}
}
You see? Automatically retained, while the previous value automatically gets released.
EDIT to answer your last question: Yes you should call autorelease
The issue is while initializing and releasing you shouldn't use self infront of the variable
self.pricingLevels = [[[NSMutableArray alloc] init];
//instead it should be
pricingLevels = [[[NSMutableArray alloc] init];
even on releasing it should be
[pricingLevels release];
pricingLevels = nil;