proper memory handling for an NSMutableArray assigned to property?

前端 未结 3 1412
余生分开走
余生分开走 2021-01-28 04:52

I have a property declared like this:

@property (nonatomic, retain) NSMutableArray *pricingLevels;

And I assign it like this:

          


        
相关标签:
3条回答
  • 2021-01-28 05:44

    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.)

    0 讨论(0)
  • 2021-01-28 05:46

    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

    0 讨论(0)
  • 2021-01-28 05:46

    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;
    
    0 讨论(0)
提交回复
热议问题