【问题标题】:NSView/NSViewController memory managementNSView/NSViewController 内存管理
【发布时间】:2015-03-01 06:00:53
【问题描述】:

在一个非常简单的测试应用程序中,我在 appdelegate 中有一个 NSViewController(强烈保留)。我将此 NSView 放在我的 NSWindow 的 contentView 中(我已在 Interface Builder 中将其设置为 Release on Close )。但是,当我退出应用程序时,NSView 的 dealloc 方法永远不会被调用。我本来希望它被以下流程调用 - NSWindow dealloc -> 删除内容视图 -> 删除所有子视图。 此外,除非我在 AppDelegate 的 applicationWouldTerminate 方法中将对其的强引用设置为 nil,否则不会释放 TestViewController。同样,我本来希望它会被释放。但是,看起来 AppDelegate 从未解除分配。 在我对 Objective-C 内存管理的理解中,我一定遗漏了一些基本的东西。可能是因为在 Mavericks Apple 强制退出应用程序,因此没有清理吗?我希望能在这方面指出正确的方向。谢谢

我的代码

#import "AppDelegate.h"

@interface TestView : NSView
@end

@implementation TestView

- (void)dealloc { NSLog(@"TestView - Dealloc"); }

@end

@interface TestViewController : NSViewController

@end

@implementation TestViewController

- (void)loadView { self.view = [[TestView alloc] init]; }

- (void)dealloc { NSLog(@"TestViewController - dealloc"); }

@end

@interface AppDelegate ()

@property (weak) IBOutlet NSWindow* window;
@property (strong) TestViewController* testViewController;

@end

@implementation AppDelegate

- (void)dealloc { NSLog(@"AppDelegate - dealloc"); }

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
    // Insert code here to initialize your application
    TestViewController* testViewController = [[TestViewController alloc] init];
    self.testViewController = testViewController;

    [self.window.contentView addSubview:testViewController.view];
}

- (void)applicationWillTerminate:(NSNotification*)aNotification
{
    // Insert code here to tear down your application
    // self.testViewController = nil;
}

@end

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    应用程序终止不会费心清理所有单个对象。当进程终止时,OS X 内核简单地回收进程使用的所有资源。这要快得多。

    来自Advanced Memory Management Programming Guide

    当应用程序终止时,可能不会向对象发送dealloc 消息。因为进程的内存在退出时会自动清除,所以简单地让操作系统清理资源比调用所有内存管理方法更有效。

    如果您确实需要在应用程序终止之前完成一些事情,请将其放入应用程序委托的-applicationWillTerminate: 方法或观察应用程序对象发布的NSApplicationWillTerminateNotification 通知。此外,您无需选择加入sudden termination,或者,如果您的应用通常选择加入它,只要它在终止时确实需要做一些事情,就暂时禁用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2016-06-06
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多