代码之家  ›  专栏  ›  技术社区  ›  Kalle

泄漏(仪器)报告自动释放对象中的泄漏

  •  6
  • Kalle  · 技术社区  · 15 年前

    [NSThread performSelectorOnMainThread:] 唯一允许他们去的地方 .

    我最近一直在运行我当前项目的漏洞,以找到漏洞,我不断遇到这些“漏洞”,从我所能知道的是不是真正的泄漏。根据泄漏情况,以下代码直接取自项目,有两处泄漏:

    - (NSArray *)areaForIndex:(int)index 
    {
        NSMutableArray *a = [NSMutableArray arrayWithArray:
            [world  retrieveNeighborsForIndex:index]]; // leak 1
        [a insertObject:[references objectAtIndex:index] atIndex:0];
        return [NSArray arrayWithArray:a]; // leak 2
    }
    

    (见更新2-3)

    如果我把最后一行改为:

        return a;
    

    更新:我已经在设备和模拟器上测试过了。两边都有漏洞。然而,在模拟器上,我得到了一些关于这次泄漏的额外信息:

    泄漏历史如下:

    # | Category | Event Type  | Timestamp | RefCt |  Address  | Size | Responsible Library | Responsible Caller
    --+----------+-------------+
    0 | CFArray  | Malloc      | 00:09.598 |     1 | 0x474f6d0 |   48 | asynchro            | -[muddyGrid areaForIndex:]
    1 | CFArray  | Autorelease | 00:09.598 |       | 0x474f6d0 |    0 | Foundation          | NSRecordAllocationEvent
    2 | CFArray  | CFRetain    | 00:09.598 |     2 | 0x474f7d0 |    0 | Foundation          | -[NSCFArray retain]
    3 | CFArray  | CFRelease   | 00:09.611 |     1 | 0x474f7d0 |    0 | Foundation          | NSPopAutoreleasePool
    

    从上面我可以看出,自动释放数组以某种方式被保留了两次,然后自动释放,保留计数为1。不知道在哪里或者为什么。。。

    更新2&3:我试着把泄漏1的管线改成:

        NSMutableArray *a = [[[NSMutableArray alloc] initWithArray:
            [world retrieveNeighborsForIndex:index]] autorelease];
    

    我以为这样可以消除漏洞,但最终没有。所以我还是不知所措。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Kalle    15 年前

    反斜视的是,这一个解决了自己,因为我用我的代码解决了一堆其他问题。

        2
  •  0
  •   Michael Kessler    15 年前

    什么 retrieveNeighborsForIndex

        3
  •  -1
  •   Kaili    15 年前

    arrayWithArray保留存储到可变数组中的对象。 http://www.iphonedevsdk.com/forum/iphone-sdk-development/14285-nsmutablearray-arraywitharray-does-add-retain.html

    我建议释放它,或者更安全地创建带有autorelease属性集的对象。当为索引调用retrive邻居时,使这些对象自动释放,当nsmutable数组被释放时,它们将被释放

    在跟踪内存错误时,我可能会添加一个提示,即启用zombie,并检查对象的引用计数。然后,您可以确定哪些文件没有被发布,这将使您的跟踪更容易。此链接将向您展示如何设置xcode项目以启用zombie:cocoadev.com/index.pl?NSZombieEnabled