Утечка NSTextField при обработке ключевых событий - PullRequest
3 голосов
/ 19 августа 2011

Я новичок в этом форуме, и я искал, но не нашел ответов на эту проблему, которая озадачивала меня большую часть этой недели.

NSTextField вызывает утечку памяти при каждом нажатии клавиши.

Я выделил эту проблему из своего кода, и ее можно воспроизвести следующим образом:

  • Создайте новый проект "Приложение какао".
  • Поместите поле NSText в главное окно главного меню. (Без привязки, розетки или действия)
  • Продукт -> Профиль, выберите инструмент «утечка памяти» (в XCode 4)

Нет утечек, пока пользователь не введет символ в текстовое поле. Я получаю 8 утечек NSCFString объектов размером 32 байта следующих типов:

Library     Responsible Caller
0     CFString     Malloc     00:11.524.538     1     0x100130bb0     32     AppKit     -[NSEvent charactersIgnoringModifiers]
1     CFString     Malloc     00:11.622.145     1     0x100136950     32     AppKit     -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]

Обратите внимание, что в этом проекте нет кода, кроме сгенерированного автоматически.

Мне было бы интересно, если кто-то еще может воспроизвести эту проблему и, возможно, даже предложить предложение, как предотвратить ее возникновение.

OS X 10.6.8 с XCode 4.0.2 (та же проблема возникает с 3.2.6)

Любое предложение будет высоко оценено и уменьшит мой текущий уровень разочарования.

Обновление:

Попробовал создание проекта выше на разных маках. Обнаружено, что один из них не производит утечки (используя ту же процедуру, что и выше, для создания проекта) Установленный XCode 4 на Mac, на котором никогда не был установлен XCode - без утечек!

ПАМЯТЬ УТЕЧКИ.

  • Стерли жесткий диск на том же MPro, установили OS X 10.6, обновили программное обеспечение до 10.6.8
  • установлен XCode4
  • создал тот же тестовый проект, что и выше

НЕТ УТЕЧКИ ПАМЯТИ !!!!!

Теперь ясно, что корень этой проблемы находится где-то в установке, а не просто в «ложном положительном результате» инструментов. Мои профили выполнялись несколько раз, так что это был одноразовый режим, и на моих компьютерах его поведение воспроизводилось на 100%.

Проблема сейчас: У меня все еще есть 27-дюймовый iMac, где стирание с жесткого диска невозможно. Я предполагаю, что есть что-то установленное (Framework?), Которое не обновляется / удаляется при обновлении или переустановке XCode.

Мы очень ценим ваши идеи относительно причины этой проблемы.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Это почти наверняка ложный позитив.Инструмент «Утечки» не является непогрешимым, и он может пометить некоторые вещи как утечки, когда они не являются (единичные примеры - типичный пример), см. мой ответ на этот вопрос .

Я подозреваю, чтоЗдесь мы видим создание редактора полей, который создается один раз для каждого окна, содержащего хотя бы одну ячейку текстового поля.Он лениво создан, поэтому будет создаваться только при необходимости, т.е. когда начинается редактирование текста.Затем он повторно используется для редактирования всего текстового поля в этом окне и не освобождается до тех пор, пока окно не исчезнет.Это именно тот тип поведения, который может вызывать ложные срабатывания в инструменте «Утечки».

Обычные объекты, такие как NSTextField, крайне вряд ли будут иметь большие утечки памяти.Они были очень тщательно протестированы и практически не меняются между версиями ОС.

0 голосов
/ 19 августа 2011

Попробуйте закрыть XCode, открыть его снова, а затем запустить «Очистить» в проекте. Иногда призраки древних мертвых моряков населяют IDE и наносят ущерб не подозревающим путешественникам. А если серьезно ... похоже, этого не должно быть. Попробую почистить и перезагрузить.

...