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

Kal*_*lle 6 iphone xcode memory-leaks instruments ipad

更新:此泄漏已解决.如果您遇到类似的泄漏,并且您的应用程序是多线程的,那么您最有可能从后台线程进行UIKit调用; 利用例如[NSThread performSelectorOnMainThread:]将UIKit呼叫路由到主线程,这是 允许它们的唯一地方.

我最近在我目前的项目上运行Leaks以发现泄漏,并且我一直在遇到这些"泄漏",据我所知,这些泄漏并非真正泄漏.根据Leaks的说法,以下代码直接来自项目,有两个漏洞:

- (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
}
Run Code Online (Sandbox Code Playgroud)

如果我将第一行更改为:泄漏1消失:(参见更新2-3)

如果我将最后一行更改为:泄漏2消失:

    return a;
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不能用泄漏1做到这一点,因为我正在将一个不可变数组转换为可变数组.不过,无论如何,arrayWithArray应该是自动释放的,所以从我所知道的,它不应泄漏任何东西.任何想法为什么会这样?

更新:我在设备和模拟器上都测试了这个.两者都有泄漏.但是,在模拟器上,我得到了一些关于此泄漏的其他信息:

泄漏的历史如下:

# | 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
Run Code Online (Sandbox Code Playgroud)

我从上面可以看出的事情是自动释放的数组以某种方式保留两次然后自动释放,保留计数为1.不知道在哪里或为什么虽然......

更新2和3:我尝试将Leak 1的行更改为:

    NSMutableArray *a = [[[NSMutableArray alloc] initWithArray:
        [world retrieveNeighborsForIndex:index]] autorelease];
Run Code Online (Sandbox Code Playgroud)

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

Kal*_*lle 2

出乎意料的是,当我用代码解决了一堆其他问题时,这个问题就自行解决了。

主要是,代码中有很多地方在主线程之外进行 UI 更新,这是一个很大的禁忌。这些其他不相关的问题之一必定触发了上述代码中的内存泄漏,因为它不再报告任何泄漏(目前我有 0 泄漏),尽管我没有修改任何代码。