NSPopover вылетает при закрытии окна

Короче говоря:

Если я помещу NSTableView со стилем выделения, установленным в SourceList, внутри NSPopover, мое приложение вылетит, когда я закрою окно, содержащее всплывающее окно.

РЕДАКТИРОВАТЬ: я могу воспроизвести эту проблему в новом проекте. https://dl.dropboxusercontent.com/u/7968745/PopoverFail.zip

Длинная история:

У меня очень странная проблема. В настоящее время отладка с помощью NSZombie, похоже, приводит к проблеме NSPopover, но я не совсем уверен, потому что не могу воспроизвести ее в новом проекте.

У меня есть NSWindow и его контроллер, который создает NSViewController и его представление (все, что создано с помощью IB). В этом представлении есть кнопка, которая открывает всплывающее окно. Это всплывающее окно имеет простой NSTableView со стилем SourceList. Поповер временный.

Если я открою всплывающее окно и сразу закрою окно, все в порядке. Если я открою всплывающее окно, сменю фокус на текстовое поле в окне (чтобы всплывающее окно закрылось), а затем закрою окно, приложение вылетит.

Включение зомби вижу следующий лог

*** -[NSPopoverFrame _subviewGeometryChanged:]: сообщение отправлено на освобожденный экземпляр 0x1005ce3d0

Если я профилирую с помощью NSZombie, это стек:

Стек инструментов

Я могу повторять проблему каждый раз. Теперь я изменил стиль представления таблицы на обычный, и сбой больше не происходит (но я потерял полупрозрачный эффект на yosemite.

Я не знаю, в чем может быть проблема, и если это действительно комбинация просмотра таблицы / всплывающего окна

РЕДАКТИРОВАТЬ: Дополнительная информация: я использую ARC. Проблема возникает при освобождении окна. Я удалил весь код приложения, кроме того, который нужен для открытия окна. Сбой происходит и в этом случае.

РЕДАКТИРОВАТЬ: я могу воспроизвести эту проблему в новом проекте. https://dl.dropboxusercontent.com/u/7968745/PopoverFail.zip

Я также открою отчет об ошибке в Apple


person Francesco    schedule 14.02.2015    source источник
comment
Вы используете АРК? Ваш NSTableView освобождается?   -  person SevenBits    schedule 15.02.2015
comment
Я использую АРК. Табличное представление создано в IB, и у меня есть слабый указатель на него в моем контроллере представления.   -  person Francesco    schedule 15.02.2015


Ответы (2)


На основе вашего ответа на комментарий; это проблема с тем, что ваш NSPopover освобождается до того, как будет вызван subviewGeometryChanged. Я не знаю, когда он вызывается, но когда он это делает, он ожидает, что ваш NSPopover существует.

Хорошая аналогия с часто используемыми воздушными шарами. Сильная отсылка — это человек, который держится за воздушный шар и одновременно указывает на него. Слабая ссылка — это человек, просто указывающий на воздушный шар, который держит кто-то другой. Итак, если слабая ссылка указывает на этот шар, и человек, держащий его, отпускает, то слабая ссылка будет указывать на nil.

Попробуйте изменить свойство NSPopover на тип (сильный) и посмотрите, исправит ли это его для вас.

person A O    schedule 15.02.2015
comment
Обычно, если объект создается в nib, nib несет ответственность за сохранение строгой ссылки на него. И чтобы избежать циклов, IBOutlet обычно равно weak. Во всяком случае, я попытался изменить его на strong, и это не решило проблему. Я начинаю думать, что проблема в другом... - person Francesco; 15.02.2015
comment
Ах, извините, я не думал полностью, что вы правы. Можете ли вы попробовать реализовать метод NSWindowDelegate, windowWillClose--, затем установить там точку останова и посмотреть, каково значение вашего NSPopover? - person A O; 16.02.2015
comment
да. Теперь с тестовым проектом очень просто :). Поповер не равен нулю в этот момент. Похоже, что некоторые уведомления или методы не обрабатываются должным образом всплывающим окном при освобождении. - person Francesco; 16.02.2015
comment
Круто ^^ вы знаете, почему с ними не обращаются должным образом? мне просто интересно сейчас - person A O; 16.02.2015
comment
Вот почему я открыл этот вопрос :) :p Надеюсь, Apple ответит на мой отчет об ошибке. - person Francesco; 16.02.2015
comment
Есть новости по этому поводу от Apple или от вас? Я столкнулся с аналогичной проблемой и не могу найти решение этой проблемы. Спасибо за связь с подсветкой Source-List, это не пришло мне в голову, основываясь на результате Zombie. - person Jacob Gorban; 24.03.2015
comment
Попробуйте установить для делегата источника данных NSTableView значение nil, когда всплывающее окно освобождается? - person A O; 24.03.2015
comment
@JacobGorban по-прежнему ничего от Apple. - person Francesco; 24.03.2015

Я не могу воспроизвести ошибку в вашем проекте, но, поскольку у меня была аналогичная проблема, я решил опубликовать ответ (и возможное решение). Если всплывающее окно открыто, а вы закрываете окно, к которому оно прикреплено, вам нужно очистить его в методе dealloc представления. Вот что я сделал:

- (void)dealloc
{
    if (self.thePopover.shown) {
        [self.thePopover close]; // forces the popover to close w/o consulting the delegate
        self.thePopover.delegate = nil;
        self.thePopover = nil;
    }
}

Это может быть удар по проблеме кувалдой (зачем мне устанавливать делегата на nil, если close не вызывает его?), но для меня это решило проблему сбоев.

person Demitri    schedule 10.07.2015
comment
Я только что попробовал еще раз, я больше не могу это проверить. Возможно, они исправили проблему (без подтверждения в отчете об ошибке). Мне любопытно, есть ли кто-нибудь с OS X 10.2 (и Xcode 6.1.1 и связанным OS X SDK), чтобы протестировать его. - person Francesco; 10.07.2015