【问题标题】:proper memory handling for an NSMutableArray assigned to property?分配给属性的 NSMutableArray 的正确内存处理?
【发布时间】:2012-01-26 03:58:26
【问题描述】:

我有一个这样声明的属性:

@property (nonatomic, retain) NSMutableArray *pricingLevels;

我这样分配它:

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

在我的 dealloc 中我有这个:

self.pricinglevels=nil;

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

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

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

【问题讨论】:

标签: objective-c nsmutablearray


【解决方案1】:

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

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

上面的代码也会做同样的事情并自动保留传递的数组。这就是幕后发生的事情(或类似的事情)。这个方法被调用:

- (void)setPricingLevels:(NSMutableArray *)a {
    if(_pricingLevels != a) {
        [_pricingLevels release];
        _pricingLevels = [a retain];
    }
}

你看到了吗?自动保留,之前的值自动释放。

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

【讨论】:

【解决方案2】:

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

(别忘了你的 dealloc 方法。)

(这一切都与对象恰好是一个 NSMutableArray 的事实无关。)

【讨论】:

    【解决方案3】:

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

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

    即使在发布时也应该是

    [pricingLevels release];
    pricingLevels = nil;
    

    【讨论】:

    • @Slee 你能在上面的代码中试试这个,让我知道它是否能解决你的问题
    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2011-12-21
    • 2010-09-27
    • 2010-09-20
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多