1

我正在使用这段代码:

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

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

谢谢。

4

1 回答 1

2

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

如果您希望面板保持不变,您必须使用 来专门保留它-retain,然后-release在 didEndSelector 中保留它:

- (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,例如将其存储在实例变量中。

于 2010-02-09T07:10:56.577 回答