【问题标题】:Memory leak on allocating and releasing an NSArray分配和释放 NSArray 时的内存泄漏
【发布时间】:2011-03-25 19:53:21
【问题描述】:

我收到 Instruments 报告的以下代码内存泄漏:

    NSArray *array = [[NSArray alloc] initWithObjects:@"Amount (oz):", @"Amount (ml):", @"Supplement:", nil];
self.fieldLabels = array;
[array release];

fieldLabels 是一个 iVar,声明为:

 NSArray *fieldLabels;
@property (nonatomic, retain) NSArray *fieldLabels;

仪器报告如下:

#   Category    Event Type  Timestamp   RefCt   Address Size    Responsible Library Responsible Caller
0   __NSArrayI  Malloc  00:16.513.592   1   0x660bb40   32  InfantCare  -[Supplemental_Amount viewDidLoad]
1   __NSArrayI  Retain  00:16.513.595   2   0x660bb40   0   InfantCare  -[Supplemental_Amount setFieldLabels:]
2   __NSArrayI  Release 00:16.513.595   1   0x660bb40   0   InfantCare  -[Supplemental_Amount viewDidLoad]

然后我更改了代码,而不是:

self.fieldLabels = array;

我说:

[self setFieldLabels:array];

没有更多的泄漏(据说!)。为什么会这样? 谢谢!

【问题讨论】:

    标签: ios memory-leaks nsarray


    【解决方案1】:

    两种语法相同。鉴于您已使用 retain 属性声明了您的 fieldLabels 属性,因此在您调用 setFieldLabels(在您编写时调用:self.fieldLabels = array)之后数组的引用计数为 1,这是您所期望的。确实,鉴于您的代码中的调用顺序,正在发生以下情况:

    1. NSArray *array = [[NSArray alloc] initWithObjects:@"Amount (oz):", @"Amount (ml):", @"Supplement:", nil]; 这会将分配的内存的 refCount 设置为 1
    2. self.fieldLabels = array; 将保留数组,释放之前由fieldLabels 保留的任何内容,并将fieldLabels 分配给保留的数组。在这个阶段,数组的保留计数为 2(1 来自 init,1 来自属性赋值)。
    3. [array release]; 将数组的保留计数恢复为 1,这正是您想要的。

    【讨论】:

    • 我就是这么想的……但是,为什么 Instruments 会报告这是内存泄漏?
    • 当持有fieldLabels 的对象被卸载时,可能会发生泄漏。你是否在任何你应该发布的地方发布fieldLabels
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2014-09-19
    • 2011-01-27
    • 2011-12-17
    • 2011-10-13
    相关资源
    最近更新 更多