使用NSCollectionView

时间:2017-03-10 06:30:32

标签: objective-c macos memory-leaks nscollectionview

我有一个简单的NSCollectionView,它显示一组图像,每个图像都有一个复选框和一个标题。我使用Leaks profiling工具运行它,它显示了一些泄漏。我试图了解泄漏的来源,因为我的代码都没有出现在泄漏的堆栈跟踪中。例如,只显示集合中的一些项目,选择图像并关闭窗口会导致15个泄漏的NSMutableIndexSet个对象。这些泄漏的大多数堆栈跟踪如下所示:

0 libsystem_malloc.dylib malloc_zone_calloc
1 libsystem_malloc.dylib calloc
2 libobjc.A.dylib class_createInstance
3 Foundation NSAllocateObject
4 AppKit -[NSCollectionViewLayoutAccessibility _visibleSections]
5 AppKit -[NSCollectionViewLayoutAccessibility _dumpVisibleChildren]
6 AppKit -[NSCollectionViewLayoutAccessibility accessibilityInvalidateLayout]
7 AppKit -[NSCollectionView layout]
8 AppKit -[NSView _doLayout]
9 AppKit -[NSView _layoutSubtreeWithOldSize:]
10 AppKit -[NSView _layoutSubtreeWithOldSize:]
11 AppKit -[NSView _layoutSubtreeWithOldSize:]
12 AppKit -[NSView _layoutSubtreeWithOldSize:]
13 AppKit -[NSView _layoutSubtreeWithOldSize:]
14 AppKit -[NSView _layoutSubtreeWithOldSize:]
15 AppKit -[NSView _layoutSubtreeWithOldSize:]
16 AppKit -[NSView _layoutSubtreeWithOldSize:]
17 AppKit -[NSView _layoutSubtreeWithOldSize:]
18 AppKit -[NSView layoutSubtreeIfNeeded]
19 AppKit -[NSWindow(NSConstraintBasedLayout) _layoutViewTree]
20 AppKit -[NSWindow(NSConstraintBasedLayout) layoutIfNeeded]
21 AppKit ___NSWindowGetDisplayCycleObserver_block_invoke6358
22 AppKit __37+[NSDisplayCycle currentDisplayCycle]_block_invoke
23 QuartzCore CA::Transaction::run_commit_handlers(CATransactionPhase)
24 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
25 QuartzCore CA::Transaction::commit()
26 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
27 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
28 CoreFoundation __CFRunLoopDoObservers
29 CoreFoundation CFRunLoopRunSpecific
30 HIToolbox RunCurrentEventLoopInMode
31 HIToolbox ReceiveNextEventCommon
32 HIToolbox _BlockUntilNextEventMatchingListInModeWithFilter
33 AppKit _DPSNextEvent
34 AppKit -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:]
35 AppKit -[NSApplication run]
36 AppKit NSApplicationMain
37 libdyld.dylib start

我的集合视图数据源和委托代码非常简单。我不知道为什么这些漏水了。谁能帮助我理解这里发生了什么?

我的代码确实分配了一些NSMutableIndexSet个对象,但它们是自动释放的实例,因此它不应该泄漏它们。 (而且,堆栈跟踪显示它不是来自我的代码创建它们的位置,所以它似乎并不相关。)

如果它有所不同,我正在使用ARC,使用Xcode 8.2.1构建我的应用程序并在macOS 10.11.6(El Capitan)上运行。

一个或两个泄漏确实在堆栈跟踪中显示了2行代码。基本上,对窗口控制器的-loadWindow方法的调用显示在堆栈的中间。当这些泄漏出现时,窗口没有被释放,所以如果窗口中有任何东西保持在它们上面,它仍然会在内存中(因此不会泄漏)。

1 个答案:

答案 0 :(得分:0)

根据Apple开发者论坛上的this discussion,看来这是已知在塞拉利昂修复的El Capitan漏洞:

  

在Sierra的Xcode 8中使用Instruments进行分析时,我不再看到泄漏。它看起来确实修复了它。谢谢Apple