打开面板然后立即消失

时间:2010-02-09 05:13:49

标签: objective-c cocoa appkit nsopenpanel

我正在使用此代码:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];

这是该方法中唯一的代码。调用该方法时,打开的面板会在屏幕上显示一秒钟然后消失。我该如何防止这种情况?

感谢。

1 个答案:

答案 0 :(得分:2)

由于面板是非阻塞的,因此一旦面板打开,代码就会继续执行。打开的面板正在被释放,因为你没有在某个地方引用它。 -openPanel是一个便利构造函数,它返回一个自动释放的对象,该对象在弹出当前自动释放池时会消失,或者(在GC应用程序中)下次运行收集器时会消失。在您的情况下,这是您的方法完成后。

如果您希望面板固定,您必须使用-retain专门保留它,然后在didEndSelector中随后-release

- (void)showPanel
{
    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; //note the retain
    [openPanel beginForDirectory:nil 
                            file:nil 
                           types:[NSImage imageFileTypes] 
                modelessDelegate:self 
                  didEndSelector:@selector(myOpenPanelDidEnd:returnCode:contextInfo:)
                     contextInfo:NULL];
}

- (void)myOpenPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo
{
    NSArray* fileNames = [panel filenames];
    [panel release];
    //do something with fileNames
}

如果您正在使用垃圾收集,则保留和释放都是无操作,因此您必须存储对NSOpenPanel的强引用,例如将其存储在实例变量中。