Objective c 如何在打开和关闭窗口时重用NSWindowController的变量
目标:我想创建一个控制器类(最好是singleton),以编程方式管理打开和关闭NSWindows。当窗口关闭时,应将其释放,以免占用内存。一次只能有一个窗口可用。我没有使用nib文件 为每个视图实例化一个新的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
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]…这些类中是否有更多代码?标题看起来像什么?