2013-12-21 2 views
0

Я думал, что буду умным и сохранить адрес функции обратного вызова C++, которая сильно связана с каждым столбцом в NSTableColumn его NSTableView. Я подклассифицировал NSTableColumn и добавил указатель как данные экземпляра. Я реализовал subclassed -dealloc, который разрушает этот указатель (и, конечно, вызывает super dealloc).Когда выпущена NSTableColumn?

Проблема заключается в том, что, как представляется, вызывается вызываемый NSTableColumn -dealloc, когда, например, когда вызывается [myNSTableView removeTableColumn: theColumn]. Я предполагаю, что проблема управления памятью - возможно, NSTableColumn является авторекламой?

Я не мог найти другого делегата/уведомления, когда удаляется NSTableColumn. Должен ли я подклассифицировать NSTableView removeTableColumn только для перехвата удаления столбца?

EDIT: поскольку некоторые задавались вопросом, этот «указатель» представляет собой экземпляр класса C++, созданного из сигналов Boost2. Он обеспечивает механизм сигнала/обратного вызова из модели C++ в метод Objective-C++. Указатель необходимо удалить, чтобы удалить подписку обратного вызова из класса вещания модели.

EDIT2: Что касается определения theColumn, это создать как можно ниже, а затем добавляют к таблице:

MyNSTableColumn * theColumn = [[MyNSTableColumn Alloc] initWithIdentifier: columnModelAsId];

И код в вопросительной итерации через столбцы таблицы, удаляя их:

while([[compareTableView tableColumns] count] > fromWhichColumn) { 
    [compareTableView removeTableColumn:[[compareTableView tableColumns] lastObject]]; 

Там отдельная переменная определения в интерфейсе:

IBOutlet NSTableColumn *myDocumentColumn; 

... который заострен к моему подклассу (MyNSTableColumn) в IB.

(Примечание: на основе Cell стол - Mac OS)

+0

iOS? C++? Ваши теги не кажутся правильными – JustSid

+1

Указатель на функцию обратного вызова не нужно уничтожать. Является ли это функтором (функционально подобным объектом)? Кроме того, почему важно, когда оно разрушается до тех пор, пока оно в конечном итоге?Если вы подозреваете утечку, используйте инструмент «Утечки», чтобы проанализировать, какой код чрезмерно удерживается или недостаточно выпущен. –

+1

Что такое объявление 'TheColumn'? Является ли это локальной переменной или переменной экземпляра? Какая строка кода (если таковая имеется), которая устанавливает его? –

ответ

1

Этот вопрос был более правильно ответил Питер Hosey (выше), но я добавлю полный ответ, если другие делают ту же ошибку, что я сделал:

После создания экземпляра моего подкласса NSTableColumn:

MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId]; 

... и добавить его к моему столику:

[myTableView addTableColumn:theColumn]; 

Я обнаружил, что мой метод dealloc подкласса не вызывался при вызове removeTableColumn.

Решение, как указывал Петр выше (и ниже), состояло в том, что, поскольку я создал объект, я ДОЛЖЕН отпустить его, даже если NSTable взял собственность/сохранил Колонну. Поэтому мне нужно было выпустить его сразу после того, я добавил его:

[theColumn release]; 

Неспособность сделать это было, конечно, глупая ошибка сделать. Как заметил Кен Томазес, инструмент «Утечки» поймал бы и поставил диагноз проблемы в короткие сроки.

+2

Ну, вам нужно освободить столбец независимо от того, что будет делать NSTableView; его собственная собственность означает только то, что у вас есть выбор, чтобы освободить столбец сразу после добавления его или в 'dealloc'. То, что NSTableView будет делать, не имеет никакого отношения к вашим собственным обязательствам; вам нужно освободить его полностью, потому что вы его создали. –

+0

@PeterHosey - Я вижу это сейчас. Я отредактировал вышеупомянутый ответ, чтобы отразить вашу точку зрения. BTW - пользовался вашим веб-сайтом. – SMGreenfield

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