Objective c OSX:如何使用ARC和基于块的工作表API保留控制器?

Objective c OSX:如何使用ARC和基于块的工作表API保留控制器?,objective-c,memory-management,automatic-ref-counting,objective-c-blocks,nswindow,Objective C,Memory Management,Automatic Ref Counting,Objective C Blocks,Nswindow,在OS X 10.9上,有一种新的基于块的图纸显示方法: [window beginSheet:[myWindowController window] completionHandler:^(NSModalResponse returnCode) { NSLog(@"done"); } ]; 问题在于,如果未在完成块中引用,myWindowController会立即解除分配。这会在其窗口关闭时导致崩溃。在使用ARC时,如何确保工

在OS X 10.9上,有一种新的基于块的图纸显示方法:

    [window beginSheet:[myWindowController window] 
        completionHandler:^(NSModalResponse returnCode) {
            NSLog(@"done");
    }
    ];

问题在于,如果未在完成块中引用,
myWindowController
会立即解除分配。这会在其窗口关闭时导致崩溃。在使用ARC时,如何确保工作表的窗口控制器在模式会话中有效?

我最初是作为注释来做的,但我会将此作为一个答案:

您应该将“
myWindowController
”分配给打开工作表的任何对象(NSWindowController或任何对象)中的强属性

例如,使用

@property (strong) NSWindowController *mySpecialSheet;

如果
myWindowController
的生命周期只需要与它的窗口(工作表)一样长,该怎么办?例如,当用户按下按钮时,工作表显示,用户与工作表交互,工作表关闭。工作表控制器的存在只是为了方便工作表的逻辑。在我看来,控制器一旦完成,就应该正确地解除分配,因此另一个控制器中的ivar不是存储的好位置。您的工作表挂在某个父窗口上,对吗?在父窗口上保持强属性是最简单的解决方案。您可以使用一个始终存在的单例来存储“
myWindowController
”对象。