パネルはノンブロッキングであるため、パネルが開くとコードの実行が続行されます。どこかへの参照を保持していないため、開いているパネルの割り当てが解除されています。-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
}
ガベージ コレクションを使用している場合、retain と release はノーオペレーションであるためNSOpenPanel
、インスタンス変数に格納するなど、代わりに への強い参照を格納する必要があります。