Поскольку панель не блокируется, выполнение кода продолжается после открытия панели. Открытая панель освобождается, потому что вы нигде не держите ссылку на нее. -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
, например, сохранять ее в переменной экземпляра.