Утечка мусора? Утечка скриптового моста? - PullRequest
3 голосов
/ 26 апреля 2010

Я всегда очень требователен к утечкам памяти, и я не могу понять, почему мои приложения для сбора мусора протекают. Мой код полностью управляется памятью и прекрасно работает без сбора мусора, без единой утечки. Однако, как только я включаю сборщик мусора, он протекает!

Просто чтобы доказать свою точку зрения, почему эта утечка возникает в приложении для сбора мусора? (поместите этот фиктивный код в applicationDidFinishLaunching:)

NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}];

Кроме того, есть ли способ предотвратить утечки в приложениях (сборщик мусора или иным образом), которые используют Scripting Bridge? кажется, что все они просочились, даже примерные в xcode.

Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Вот частичный ответ.

В большинстве управляемых языков каждая структура, способная содержать ссылки на другой объект, встраивает информацию, по которой смещение может содержать адрес памяти. Например, в каждом кадре стека есть место, которое сообщает сборщику мусора, где искать адреса.

Языки на основе C, такие как Objective-C, не имеют этого.

Для корректности программы лучше иметь слишком много объектов, чем освобождать объекты слишком рано. Поэтому сборщик мусора в Objective-C ищет шаблоны, которые выглядят как адреса, но не могут точно знать, действительно ли они являются адресами. Это может (и почти неизбежно) приводить к ложным срабатываниям для ссылок (и несовместимо с некоторыми методами управления памятью, которые вы можете использовать с C). Поэтому некоторые объекты могут пережить свою полезность, пока не прекратит свое существование случайное целое число.

Кроме того, как вы говорите, что утечка? Вы просто сравнили след памяти или проверили их с помощью инструмента «Утечки»? Вы пробовали инструмент «GC Monitor»?

0 голосов
/ 26 апреля 2010

Извините, я забыл упомянуть об этом, я использую инструмент "Утечки" в инструментах. Там, где я вижу утечки. Я еще не пробовал инструмент "GC Monitor". Утечки небольшие, и я не могу отследить их до моего кода, используя расширенные детали.

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

Так это с шаблоном GC нормально? Должен ли я просто игнорировать это?

...