我一直在使用Instruments應用程序檢查我的應用程序泄漏。在某些情況下,HUD Panel中的表格視圖每秒更新一次。除了每秒(reloadData),_NSArrayl對象的數量增加一個,它都工作正常。如果我將我的數據源更改爲僅返回(@「」); (他們都是文本單元格),問題依然存在(不變)。如果我刪除我周圍所有的代碼只是:NSTableView reloadData泄漏內存
[myTableView reloadData];
和
- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)column row:(int)rowIndex {
return(@"");
}
(甚至返回nil)
問題仍然存在。註釋掉[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
我曾經在歷史上注意到這些對象有一個自動釋放條目,如果它已經被自動釋放我不知道(保留計數仍然是1)。但5分鐘後,沒有任何東西釋放它們,所以也許autorelease池沒有被釋放。我不創建任何autorelease池(並且不釋放任何),留下應用程序框架。我應該使用autorelease池做些什麼嗎?
# 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而不是「垃圾收集」 - 只是保留/發佈系統,我傾向於使用retain/release,我自己的代碼偶爾會使用autorelease,無處可用此代碼。
附加信息:我一直在坐着看數量的增加,只使用Instruments應用程序(tableview在總是可見的HUD中)。但是,如果我將鼠標移到「泄漏」的桌面視圖上 - 計數可以回到合理的程度。將包含桌面視圖的HUD窗口稍稍移動一下,計數就會降低,等等。這似乎是缺少允許這種情況發生的用戶活動。我仍然難過,但認爲這個新的觀察可能有助於想法(或者如果有人試圖重現它)。
對不起 - 我搞砸了,併發布了一個後續問題作爲答案出現在您的答案上方。基本上,按照你的建議,我嘗試了虛擬賽事......工作......不確定......看到上面的細節。非常感謝 – 2012-08-09 09:30:49