分配给属性的NSMutableArray的正确内存处理?

时间:2011-12-22 14:10:26

标签: objective-c nsmutablearray

我有一个声明如下的属性:

@property (nonatomic, retain) NSMutableArray *pricingLevels;

我这样分配:

 self.pricingLevels = [[[NSMutableArray alloc] init];

在我的dealloc中我有这个:

self.pricinglevels=nil;

当我用xCode分析我的代码时,它说我在这里有内存泄漏:

self.pricingLevels = [[[NSMutableArray alloc] init];

我是否应该使用autolrelease,因为self.pricinglevels还包含对数组的引用?

3 个答案:

答案 0 :(得分:2)

self.pricingLevels是一个声明为retained的属性,这意味着每次通过属性赋值(点语法或方法)设置它时,对象会自动为您保留对象。

self.pricingLevels = [NSMutableArray array];
[self setPricingLevels:[NSMutableArray array]];

上面的代码将执行相同的操作并自动保留传递的数组。这是引擎盖下发生的事情(或类似的东西)。调用此方法:

- (void)setPricingLevels:(NSMutableArray *)a {
    if(_pricingLevels != a) {
        [_pricingLevels release];
        _pricingLevels = [a retain];
    }
}
你知道吗?自动保留,而前一个值自动释放。

编辑回答您的上一个问题是的,您应致电autorelease

答案 1 :(得分:0)

是的,你有内存泄漏。为self.propertyName分配保留属性会自动执行保留。您需要在分配后释放对象(在分配vs使用release后稍微提高效率autorelease),或者您需要将保留对象分配给实例字段(无self. })不是属性名称,AND,对于后一种情况,您需要确保实例字段以前是nil(即,只在初始化逻辑中进行直接赋值)。

(不要忘记你的dealloc方法。)

(这与该对象恰好是NSMutableArray的事实无关。)

答案 2 :(得分:0)

问题是 在初始化和释放时,你不应该使用变量的自我面前

self.pricingLevels = [[[NSMutableArray alloc] init];
//instead it should be

pricingLevels = [[[NSMutableArray alloc] init];

即使发布它也应该

[pricingLevels release];
pricingLevels = nil;