【发布时间】:2016-06-06 22:54:32
【问题描述】:
我的环境是 Yosemite 10.10.5 和 Xcode 7.2 使用 ARC。
在一个简单的测试程序中,我尝试了多种方法来关闭 NSViewController,但它们都显示出内存处理问题。
在我的主视图控制器中,我有以下代码。 (通知片段用于测试解除呈现控制器的各种方法。)
- (IBAction)showFirstReplacement:(id)sender {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissWithNotification:) name:@"removeFirst" object:nil];
NSStoryboard *sb = [self storyboard];
FirstReplacement *controller = [sb instantiateControllerWithIdentifier:@"first_replacement"];
[self presentViewControllerAsSheet:controller];
}
- (void)dismissWithNotification:(NSNotification *)notification {
NSViewController *controller = [notification object];
[self dismissViewController:controller];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
在FirstReplacement里面,我有:
- (IBAction)dismiss:(id)sender {
[self dismissViewController:self];
// [[NSNotificationCenter defaultCenter] postNotificationName:@"removeFirst" object:self];
// [[self presentingViewController] dismissViewController:self];
}
取消注释此方法中的三行中的任何一行都会产生正确的视觉结果,但是.... 根据我在 dismiss: 中启用的调用,我在分析时会得到不同的结果。使用self dismissViewController:,我看不到任何泄漏,但FirstReplacement 对象没有被释放。使用其他两种方法中的任何一种都可以消除已关闭的 FirstReplacement,但每次关闭视图控制器时都会泄漏一个 16 字节的 malloc 块和一个 NSMutableArray。
根据 Instruments 的说法,泄漏与称为 [NSViewController _addPresentedViewController:] 的方法有关。
是否有其他必要的清理步骤来防止这些泄漏(或非泄漏情况下的内存膨胀)?
【问题讨论】:
-
FirstReplacement::dismiss 是从哪里调用的?
-
连接到情节提要中的 IBAction 的按钮。
-
我能够使用 Swift 和故事板在 10.11.6 上重现此错误。但是,从 10.13.2 开始,该错误似乎已修复。在 10.13.2 上,我在 Xcode 的 Memory Graph Debugger(在运行时问题下)或在 Instruments 应用程序中使用 Leaks Instrument 时没有看到泄漏。
标签: objective-c macos memory-leaks nsviewcontroller