我正在使用此代码:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];
这是该方法中唯一的代码。调用该方法时,打开的面板会在屏幕上显示一秒钟然后消失。我该如何防止这种情况?
感谢。
答案 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
的强引用,例如将其存储在实例变量中。