У меня есть приложение Cocoa, которое представляет собой начальный экран. После сбора некоторой информации от пользователя, которую я проверяю, и проверьте, действительно ли это - если я показываю зеленую галочку, а затем подождите 1 секунду и перекрестно вставьте окно запуска в основное окно приложения. У меня есть 2 NSWindowControllers с 2 окнами xib-файлов.Cocoa: Как правильно освободить NSWindowController после исчезновения его окна
На моем startupWindowController
У меня есть кнопка розетки, которая делает то, что я описал выше.
- (void)fadeOutAndPresentMainWindow {
// Initialize the main window from XIB
mainWindowController = [[MyMainWindowController alloc] init];
NSWindow *mainWindow = [mainWindowController window];
// Position the main window BEHIND the currently visible startup window
NSWindow *startupWindow = [startupController window];
[mainWindow setFrame:[startupWindow frame] display:NO];
[mainWindow orderWindow:NSWindowBelow relativeTo:[startupWindow windowNumber]];
// Now wait 1 second and fade out the startupWindow to reveal the main window
// that is behind it.
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setCompletionHandler:^{
// releases when closed
[startupWindow close];
// deallocates the startup controller *after* the animation? or not...
[startupWindowController release];
startupWindowController = nil;
}];
// Do the fade
[[startupWindow animator] setAlphaValue:0.0f];
[NSAnimationContext endGrouping];
// Now make the main window key
[mainWindow makeKeyWindow];
});
}
Это все прекрасно работает, с одной проблемой: Если пользователь нажимает на кнопку с IBOutlet
во увядание анимации происходит сбой приложения. MyStartupController performSelector:withObject:]: message sent to deallocated instance 0x102c00a90
. Поэтому проблема заключается в том, что startupController
освобождается до завершения анимации.
Так что, я думаю, я не уверен, как правильно освободить этот контроллер окна после его угасания. Любые идеи, как это сделать?
Если он освобождает его, сохраните его, создайте сильный указатель на некоторое время вокруг объекта, пока анимация не завершится. – Sandeep
Я выпускаю его после завершения анимации. Блок завершения, похоже, не вызывается в соответствующее время. – nrj
Лучше просто не использовать заставки ... – uchuugaka