2013-09-05 2 views
0

У меня есть приложение 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 освобождается до завершения анимации.

Так что, я думаю, я не уверен, как правильно освободить этот контроллер окна после его угасания. Любые идеи, как это сделать?

+0

Если он освобождает его, сохраните его, создайте сильный указатель на некоторое время вокруг объекта, пока анимация не завершится. – Sandeep

+0

Я выпускаю его после завершения анимации. Блок завершения, похоже, не вызывается в соответствующее время. – nrj

+0

Лучше просто не использовать заставки ... – uchuugaka

ответ

0
Better place to declare the same in your dealloc method:- 
- (void)dealloc 
{ 
[startupWindowController release]; 
startupWindowController=nil; 
} 
+0

Прошу прощения, но где этот код должен идти? – nrj

+0

Класс, где u инициализировал экземпляр windowcontroller –

+0

Это был бы делегат моего приложения, который живет до тех пор, пока приложение ... – nrj

Смежные вопросы