【问题标题】:NSMutableArray leaks warning addressed by the Instrument仪器解决的 NSMutableArray 泄漏警告
【发布时间】:2012-05-15 16:36:25
【问题描述】:

我正在使用 Instrument 泄漏工具来检查代码中的泄漏。

//MyClass.h
@property (nonatomic, retain) NSMutableArray *marrProperty;

//MyClass.m
NSSortDescriptor *createdTime = [[NSSortDescriptor alloc] initWithKey:@"createdTime" ascending:NO selector:@selector(compare:)];             
NSArray *sortedArray = [self.anManagedObj.aRelationships sortedArrayUsingDescriptors:[NSArray arrayWithObject:createdTime]];
[createdTime release];
NSMutableArray *marr = [[NSMutableArray alloc] initWithArray:sortedArray];
self.marrProperty = marr;
[marr release];

使用 Instrument 中的泄漏工具检查后,我被告知泄漏发生在以下代码中:

NSMutableArray *marr = [[NSMutableArray alloc] initWithArray:sortedArray];
self.marrProperty = marr;

我不知道为什么,因为我只是分配和释放。

【问题讨论】:

    标签: iphone ios nsmutablearray instruments memory-leaks


    【解决方案1】:

    您是否为 marrProperty 实现了自定义设置器?这可能是内存问题的根源。

    此外,您可能更喜欢使用[[sortedArray mutableCopy] autorelease],而不是initWithArray:,后跟release。只是为了代码清晰。

    如果您不使用 ARC,请确保在该类的 -dealloc 中释放 marrProperty。

    【讨论】:

    • 只是@systhesize marrProperty
    • 此代码中似乎没有问题。您是否在该类的 dealloc 方法中释放 marrProperty ?保留属性必须在 dealloc 中释放。
    • 我用的是ARC,所以不需要dealloc
    • 如果不需要dealloc,那么你使用release没有意义(实际上应该是一个错误) - 如果你调用release没有得到错误,ARC没有打开。
    • 该属性将被自动释放,我只是释放一个 ivar。没有错误。
    【解决方案2】:

    仪器显示您分配了泄漏的对象,而不是泄漏的位置。

    你需要找到额外的retain。你可以使用 Instruments 来做到这一点;分配工具可以配置为跟踪保留/释放事件。

    This will likely be helpful.

    【讨论】:

    • 好吧,我不知道为什么所有Heapshots中都没有NSMutableArray。
    • 可能是因为您只泄漏了一个。所以,点击那个并检查保留/释放历史,看看额外的保留来自哪里。
    • 跟踪显示:(Event Type, RefCt), (Malloc, 1), (Retain, 2), (release 1)
    • 对。所以你错过了一个保留(如果你期望对象消失)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2017-09-27
    • 2012-02-18
    • 2011-11-02
    • 2014-05-02
    • 2011-03-09
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多