我使用这个代码:

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

这是在该方法中的唯一的代码。当该方法被调用时,打开面板屏幕上出现的第二然后消失。如何避免这种情况?

感谢。

有帮助吗?

解决方案

由于面板是非阻塞的,一旦面板已经打开代码继续执行。开启面板被释放,因为你不是抱着一提到它的地方。 -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,如将它存储在一个实例变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top