打开面板出现后立即消失
-
19-09-2019 - |
题
我使用这个代码:
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
,如将它存储在一个实例变量。
不隶属于 StackOverflow