Привязки какао - освобождение, пока наблюдатели значения ключа все еще были зарегистрированы предупреждения

Я использовал привязки Какао в моем NSTableCellView внутри моего NSOutlineView, но предоставлял свои собственные данные в метод outlineView objectValueForTableColumn:byItem: (т.е. не использовал NSArrayController для содержимого). Он работает нормально, пока я не удалю строку из таблицы, где я получаю управляемый объект и удаляю его из контекста, а в наблюдателе NSManagedObjectContextWillSaveNotification я обновляю свою модель данных и удаляю строку из OutlineView. Но когда я это делаю, я получаю предупреждение:

Экземпляр 0x10d922890 класса Log_Log_ был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы в нем. Информация о наблюдении просочилась и может даже быть ошибочно привязана к какому-либо другому объекту. Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике. Вот информация о текущем наблюдении ....

Установка точки останова на самом деле не помогает выявить проблему. Я знаю, что что-то наблюдает за свойствами в журнале (tableCellView, который выполняет привязку), но как мне очистить его, когда строка удаляется из представления структуры? Я переопределяю didTurnIntoFault журнала и получаю значение, отличное от нуля, в self.observationInfo, но я не думаю, что это может помочь определить, какой объект наблюдения нужно удалить в качестве наблюдателя на данном этапе. Я не уверен, почему это происходит, и как лучше всего отладить это, чтобы найти объект-нарушитель, который является наблюдателем «привязок».


person Z S    schedule 30.07.2014    source источник


Ответы (1)


NSTableCellViews сохраняются для повторного использования, поэтому ваш зомби-вид cellView удерживает objectValue. Когда вы удаляете строку, вы можете захотеть обнулить objectValue в представлениях ячеек.

Возможно, имеет смысл использовать для этого NSTableViewDelegate didRemoveRowView: forRow.

person stevesliva    schedule 30.07.2014
comment
Не помогает, все еще вылетает - person Julian F. Weinert; 05.02.2016
comment
@Julian попробуйте явное unbind перед установкой на ноль. Подобно тому, что предлагается в внизу страницы страницу здесь. Если это сработает для вас, я обновлю этот ответ. То, что нужно освободить, может зависеть от вашего кода. - person stevesliva; 07.02.2016
comment
Я обнаружил, что у меня тоже проблема с памятью, поэтому решение было как бы скрыто. Работал сейчас спасибо - person Julian F. Weinert; 09.02.2016