美文网首页玩转MacMac开发云集Mac优雅使用指南
Mac开发--关于手工创建的NSWindow崩溃的问题

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

作者: 背靠背的微笑 | 来源:发表于2016-11-07 11:25 被阅读393次

    定义一个属性变量,@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则没有这个问题。

    相关文章

      网友评论

      • Solin_solin:感谢,正好这2天尝试Mac开发,网上资料,代码太少
        背靠背的微笑:@Solin_solin 不客气撒,大家互相学习,可以关注一下我的专题,里面收集了一些简书上的Mac开发

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

      本文链接:https://www.haomeiwen.com/subject/bbxouttx.html