【发布时间】:2011-03-09 06:53:01
【问题描述】:
更新:此泄漏已得到解决。如果您遇到类似的泄漏并且您的应用程序是多线程的,那么您很可能从后台线程进行 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
}
如果我将第一行更改为:(参见更新 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];
我认为这消除了泄漏,但最终并没有。所以我还是一头雾水。
【问题讨论】:
-
你是在设备上测试还是在模拟器上测试?
-
目前仅在设备上。但你是对的,我会在模拟器上进行测试,看看结果如何并更新。
-
更新了上面的描述,包括我在模拟器上尝试的结果。谢谢指点! :)
标签: iphone xcode ipad instruments memory-leaks