Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode MacOSX:在窗口关闭时释放NSWindowController_Xcode_Macos_Nswindowcontroller - Fatal编程技术网

Xcode MacOSX:在窗口关闭时释放NSWindowController

Xcode MacOSX:在窗口关闭时释放NSWindowController,xcode,macos,nswindowcontroller,Xcode,Macos,Nswindowcontroller,我正在创建一个新窗口: - (void)newWindow { if (!_myWindow) { self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"]; } [self.categoriasView showWindow:self]; } 但我想在窗口从NSWindowController关闭时释放窗口对象,方法是: - (void)wi

我正在创建一个新窗口:

- (void)newWindow
{
    if (!_myWindow)
    {
        self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"];

    }

    [self.categoriasView showWindow:self];
}
但我想在窗口从NSWindowController关闭时释放窗口对象,方法是:

- (void)windowWillClose:(NSNotification *)notification
{

}
我尝试过[self.windowsetreleasedwhenclosed:YES];但当窗户关闭后,物体仍然在那里

你们中有人知道在窗口关闭后如何释放NSWindow对象吗


非常感谢您的帮助首先,NSWindow或子类的窗口实例与NSWindowController或子类的窗口控制器实例之间存在差异。您的问题和代码似乎可以互换使用这两个术语

使用窗口控制器时,不会释放窗口本身。窗口控制器拥有它,它将在完成后释放它。同样,对于由窗口控制器拥有的窗口,将忽略releasedWhenClosed。这是用getter记录的

显然,您的代码在myWindow属性中保留了对窗口控制器的强引用,尽管您的代码段也以类似于窗口控制器的方式引用了categoriasView属性。如果清除该属性,将释放窗口控制器。如果这是最后一个强引用,那么窗口控制器将被释放并释放窗口

如果已为窗口指定了代理,则可以清除窗口代理的-windowWillClose:方法中的属性。通常(但不一定)窗口控制器是窗口的代理。你可以在笔尖上设置。但是,在这种情况下,窗口控制器清除其所有者的属性不是很方便

另一种方法是让窗口控制器的所有者观察窗口发出的NSWindowWillCloseNotification。您可以这样设置:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window];
然后,可以在窗口委托以外的对象中实现-windowWillClose:方法。在该方法中,您将执行以下操作:

- (void)windowWillClose:(NSNotification *)notification
{
    NSWindow* window = notification.object;
    if (window == self.myWindow.window)
        self.myWindow = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:window];
}

首先,NSWindow或子类的窗口实例与NSWindowController或子类的窗口控制器实例之间存在差异。您的问题和代码似乎可以互换使用这两个术语

使用窗口控制器时,不会释放窗口本身。窗口控制器拥有它,它将在完成后释放它。同样,对于由窗口控制器拥有的窗口,将忽略releasedWhenClosed。这是用getter记录的

显然,您的代码在myWindow属性中保留了对窗口控制器的强引用,尽管您的代码段也以类似于窗口控制器的方式引用了categoriasView属性。如果清除该属性,将释放窗口控制器。如果这是最后一个强引用,那么窗口控制器将被释放并释放窗口

如果已为窗口指定了代理,则可以清除窗口代理的-windowWillClose:方法中的属性。通常(但不一定)窗口控制器是窗口的代理。你可以在笔尖上设置。但是,在这种情况下,窗口控制器清除其所有者的属性不是很方便

另一种方法是让窗口控制器的所有者观察窗口发出的NSWindowWillCloseNotification。您可以这样设置:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window];
然后,可以在窗口委托以外的对象中实现-windowWillClose:方法。在该方法中,您将执行以下操作:

- (void)windowWillClose:(NSNotification *)notification
{
    NSWindow* window = notification.object;
    if (window == self.myWindow.window)
        self.myWindow = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:window];
}

我给卡塔琳娜的两分钱

有点旧的帖子。。但也可能有用:

我依附在shouldClose下,以便更好地控制。。但它是一样的。。结果

只需设置为零:

func windowShouldClose(_ sender: NSWindow) -> Bool {

    #if DEBUG
    let closingCtl = sender.contentViewController!
    let closingCtlClass = closingCtl.className
    print("\(closingCtlClass) is closing")
    #endif


    sender.contentViewController = nil // will force deinit.

    return true // allow to close.
}

我给卡塔琳娜的两分钱

有点旧的帖子。。但也可能有用:

我依附在shouldClose下,以便更好地控制。。但它是一样的。。结果

只需设置为零:

func windowShouldClose(_ sender: NSWindow) -> Bool {

    #if DEBUG
    let closingCtl = sender.contentViewController!
    let closingCtlClass = closingCtl.className
    print("\(closingCtlClass) is closing")
    #endif


    sender.contentViewController = nil // will force deinit.

    return true // allow to close.
}