【问题标题】:How to reuse variable for NSWindowController when opening and closing window打开和关闭窗口时如何为 NSWindowController 重用变量
【发布时间】:2014-02-13 07:32:54
【问题描述】:

目标:我想创建一个控制器类(最好是单例)以编程方式管理打开和关闭 NSWindows。当一个窗口关闭时,它应该被释放,这样它就不会占用内存。一次只有一个窗口可用。我没有使用 nib 文件。

为每个视图实例化一个新的 NSWindowController 并使用它的 close 方法关闭它似乎会导致内存问题 (EXC_BAD_ACCESS)。

在此示例中,应用程序在通过预定计时器重新打开窗口时崩溃。

AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  self.controller = [[MyController alloc] init];
  [self.controller open];
  [self.controller close];
  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self.controller selector:@selector(open:) userInfo:NULL repeats:false];
}

我的控制器

- (void) open:(NSTimer *) timer {
    [self open];
}
- (void) open {
    self.windowController = [[NSWindowController alloc]
                             initWithWindow: [[NSWindow alloc]
                                              initWithContentRect:NSMakeRect(30, 30, 300, 300)
                                              styleMask:NSTexturedBackgroundWindowMask
                                              backing:NSBackingStoreBuffered
                                              defer:false]];
    [[self.windowController window] setReleasedWhenClosed:true];
    [[self.windowController window] orderFrontRegardless];
}
- (void) close {
    [self.windowController close];
}

显然,这感觉是一种糟糕的方法。实现目标的更好设计是什么?

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    我不确定您是否在其他任何地方引用 self.windowController,但为了安全起见,您应该这样做:

    - (void) close {
        [self.windowController close];
        self.windowController = nil;
    }
    

    所以你不会在它被释放后不小心触摸到它。

    另外,就风格而言,不要使用这样的一次性计时器,只需使用-perform:withObject:afterDelay:

    最后,当您考虑创建一个单例类来控制另一个类的实例时,请考虑将这些方法作为子类的类方法。例如,您可以使用 +open+close 方法编写自己的 NSWindowController 类。

    【讨论】:

    • 而Objective-C约定是使用YES/NO而不是true/false。 :)
    • 这很有道理,Wil,但如果我设置 self.windowController = nil;再次尝试使用该变量时应用程序崩溃:self.windowController = [[NSWindowController alloc]..
    • 这些类中是否有更多代码?标题是什么样的?
    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多