我一直在使用 Instruments 应用程序检查我的应用程序是否存在泄漏。在某些情况下,HUD 面板中的表格视图每秒更新一次。除了每秒(reloadData) _NSArrayl 对象的数量增加一之外,一切正常。如果我将数据源更改为 return(@""); (它们都是文本单元格)然后问题仍然存在(没有变化)。如果我将所有周围的代码删除为:
[myTableView reloadData];
和
- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)column row:(int)rowIndex {
return(@"");
}
(甚至返回零)
问题仍然存在。注释掉 [myTableView reloadData],问题就消失了。每个块都是一个 _NSarrayl,大小为 32 字节,详细信息:
0 libsystem_c.dylib calloc
1 libobjc.A.dylib class_createInstance
2 CoreFoundation __CFAllocateObject2
3 CoreFoundation +[__NSArrayI __new::]
4 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:]
5 CoreFoundation +[NSArray arrayWithObjects:]
6 AppKit -[NSWindow _runLoopModesForInvalidCursorRectsObserver]
7 AppKit __-[NSWindow _postInvalidCursorRects]_block_invoke_1
8 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
9 CoreFoundation __CFRunLoopDoObservers
10 CoreFoundation __CFRunLoopRun
11 CoreFoundation CFRunLoopRunSpecific
12 HIToolbox RunCurrentEventLoopInMode
13 HIToolbox ReceiveNextEventCommon
14 HIToolbox BlockUntilNextEventMatchingListInMode
15 AppKit _DPSNextEvent
16 AppKit -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
17 AppKit -[NSApplication run]
18 AppKit NSApplicationMain
我注意到这些对象的历史记录中有一个 Autorelease 条目,所以我想知道它是否已被自动释放(保留计数仍为 1)。但是 5 分钟后,没有任何东西释放它们,所以可能自动释放池没有被释放。我不创建任何自动释放池(也不释放任何),而是留下应用程序框架。我应该对自动释放池做些什么吗?
# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller
0 0x100669cf0 __NSArrayI Malloc 1 00:01.342.634 32 AppKit -[NSWindow _runLoopModesForInvalidCursorRectsObserver]
1 0x100669cf0 __NSArrayI Autorelease <null> 00:01.342.636 0 AppKit -[NSWindow _runLoopModesForInvalidCursorRectsObserver]
任何关于我可能做错了什么的建议将不胜感激。
请注意,1秒更新的情况对于应用程序来说不是“正常情况”,但它可能会发生,然后应用程序设计了很长时间;即不是您运行、退出、再次运行、退出等的应用程序。
它们没有被检测为“泄漏”,但分配计数一直在增加,所以我认为它们在实践中是泄漏(或出现问题)
我没有使用 ARC 而不是“垃圾收集”——只是保留/释放系统,我倾向于使用保留/释放,而我自己的代码只是偶尔使用自动释放,并且与此代码无关。
附加信息:我一直在看着计数增加,只使用 Instruments 应用程序(表格视图位于始终可见的 HUD 中)。但是,如果我将鼠标移到“泄漏”的 tableview 上 - 计数会回到合理的值。在屏幕上稍微移动包含 tableview 的 HUD 窗口,计数会回落,等等。似乎是缺少用户活动导致这种情况发生。我仍然很困惑,但认为这个新的观察可能有助于想法(或者如果有人试图重现它)。