Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
Objective c 如何在打开和关闭窗口时重用NSWindowController的变量_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 如何在打开和关闭窗口时重用NSWindowController的变量

Objective c 如何在打开和关闭窗口时重用NSWindowController的变量,objective-c,macos,cocoa,Objective C,Macos,Cocoa,目标:我想创建一个控制器类(最好是singleton),以编程方式管理打开和关闭NSWindows。当窗口关闭时,应将其释放,以免占用内存。一次只能有一个窗口可用。我没有使用nib文件 为每个视图实例化一个新的NSWindowController,并使用它的close方法关闭它,似乎会导致内存问题(EXC\u BAD\u ACCESS) 在本例中,当通过定时计时器重新打开窗口时,应用程序崩溃 AppDelegate - (void)applicationDidFinishLaunching:(N

目标:我想创建一个控制器类(最好是singleton),以编程方式管理打开和关闭NSWindows。当窗口关闭时,应将其释放,以免占用内存。一次只能有一个窗口可用。我没有使用nib文件

为每个视图实例化一个新的
NSWindowController
,并使用它的
close
方法关闭它,似乎会导致内存问题(EXC\u BAD\u 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];
}
MyController

- (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];
}

显然,这是一种糟糕的做法。要实现这一目标,什么样的设计更好?

我不确定您是否在其他地方提到self.windowController,但出于安全考虑,您应该:

- (void) close {
    [self.windowController close];
    self.windowController = nil;
}
这样你就不会在窗户打开后不小心碰到它了

另外,作为一种风格,不要像那样使用一次性计时器,只需使用
-perform:withObject:afterDelay:


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

和Objective-C约定使用
YES/NO
而不是
true/false
:)这是有道理的,威尔,但如果我设置self.windowController=nil;当再次尝试使用该变量时,应用程序崩溃:self.windowController=[[NSWindowController alloc]…这些类中是否有更多代码?标题看起来像什么?