gpt4 book ai didi

iphone - Leaks (instrument) 报告自动释放对象中的泄漏

转载 作者:行者123 更新时间:2023-12-03 18:47:42 24 4
gpt4 key购买 nike

更新:此泄漏已得到解决。如果您遇到类似的泄漏并且您的应用程序是多线程的,那么您很可能是从后台线程进行 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
}

如果我将第一行更改为: ,泄漏 1 就会消失(请参阅更新 2-3)

如果我将最后一行更改为:Leak 2 就会消失:

    return a;

不幸的是,我不能用泄漏 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

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

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

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

我认为这消除了泄漏,但最终并没有。所以我还是很茫然。

最佳答案

虎头蛇尾的是,当我用代码解决了一堆其他问题时,这个问题就自行解决了。

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

关于iphone - Leaks (instrument) 报告自动释放对象中的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com