我有一个声明如下的属性:
@property (nonatomic, retain) NSMutableArray *pricingLevels;
我这样分配:
self.pricingLevels = [[[NSMutableArray alloc] init];
在我的dealloc中我有这个:
self.pricinglevels=nil;
当我用xCode分析我的代码时,它说我在这里有内存泄漏:
self.pricingLevels = [[[NSMutableArray alloc] init];
我是否应该使用autolrelease
,因为self.pricinglevels
还包含对数组的引用?
答案 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;