Сбой NSWindowController orderOut в Mac Yosemite 10.10

Следующий код отлично работал для Mavericks (10.9), но после обновления до Yosemite 10.10 происходит сбой. Каков наилучший способ преодоления овер-аутов листов?

В моем классе есть член:

EmailClientWindowController* emailClientSheet;

(в то время как EmailClientWindowController : NSWindowController)

При нажатии какой-либо кнопки я представляю окно как модальный лист:

self.emailClientSheet = [[EmailClientWindowController alloc] initWithDocument:document];
[NSApp beginSheet:self.emailClientSheet.window modalForWindow:self.view.window modalDelegate:self
       didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) contextInfo:nil];

И его метод didEndSheet выглядит следующим образом:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    self.emailClientSheet = nil;
    [sheet orderOut:self];
}

Но строка [лист orderOut:self] теперь дает сбой в Yosemite! И этот код работает уже несколько лет! Как лучше всего решить эту проблему?

Спасибо!

Нили


person Nili    schedule 22.10.2014    source источник
comment
Попробуйте [sheet close] может быть?   -  person jsd    schedule 22.10.2014
comment
Там тоже происходит такая же авария.   -  person Nili    schedule 23.10.2014


Ответы (1)


Решение состоит в том, чтобы заменить порядок присваивания nil и orderOut. Значение:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    [sheet orderOut:self];
    self.emailClientSheet = nil;
}

До сих пор не понял, что Apple изменила в OSX 10.10 по сравнению с 10.9, возможно, некоторые оптимизации памяти. Не нашел никаких подсказок ни в примечаниях к выпуску 10.10, ни в блогах. В любом случае этот код лучше подходит для выпуска окон.

person Nili    schedule 23.10.2014