Mac开发--关于手工创建的NSWindow崩溃的问题

定义一个属性变量,@property (nonatomic, strong) MyWindow *myWindow;

1、实现懒加载的属性方法

-(MyWindow *)myWindow

{

if (!_myWindow) {

NSRect frame = CGRectMake(0, 0, 400, 200);

NSUInteger style = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask;

_myWindow = [[MyWindow alloc] initWithContentRect:frame styleMask:style backing:NSBackingStoreBuffered defer:YES];

_myWindow.title = @"New Create Window";

[_myWindow center];

}

return _myWindow;

}

2、定义按钮的点击事件,显示myWindow

- (IBAction)showWindowAction:(id)sender {

[self.myWindow makeKeyAndOrderFront:self];

}

你会发现只有第一次你可以正常呼出myWindow显示到屏幕上,当你关闭这个window再点击按钮的时候,程序就会崩溃。


程序崩溃


3、我们在myWindow的实现中增加dealloc方法

-(void)dealloc

{

NSLog(@"myWindow dealloc");

}

我们重现运行,点击按钮,显示window。关闭window后发现控制台输出打印myWindow dealloc。这说明虽然我们声明了window为强引用,但是对于window的释放,系统是特殊处理的,只要关闭就释放了。


4、定义一个NSWindowController

@property (nonatomic, strong) NSWindowController *myWindowController;

实现懒加载的属性方法,里面设置了myWindowController和myWindow的关系

- (NSWindowController *)myWindowController

{

if (!_myWindowController) {

_myWindowController = [[NSWindowController alloc] init];

_myWindowController.window = self.myWindow;

}

return _myWindowController;

}

在上面myWindow的懒加载方法中,添加_myWindow.windowController = self.myWindowController;

这样重新运行,反复关闭window再点击按钮打开,没有崩溃。

结论:手工创建的NSWindow,关闭后系统会检查这个window有没有controller引用它,有的话就不会释放这个window对象。xib中创建的window则没有这个问题。

推荐阅读更多精彩内容