Почему сборка мусора не работает с потоками? - PullRequest
0 голосов
/ 21 февраля 2011

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

Сборщик мусора, похоже, ничего не знает о том, что происходит в этой теме, независимо от того, что я делаю. Я попытался [NSThread self], [NSThread currentThread], [[NSGarbageCollector defaultCollector] collectIfNeeded] и collectExhaustivly]. Я переключился на NSOperation с NSOperationQueue из NSThread.

Ни одно из предложенных решений не сработало. Совсем недавно я перешел с NSMutableArrays на

Float32* pfArray= calloc(numFloats, sizeof(Float32));

для хранения моих данных, и использовал free(pfArray); чтобы освободить эту память. Это работает лучше, но все еще течет приличное количество.

Сборка мусора, похоже, начинает работать в некоторой степени после того, как «реальный мем», указанный в Activity Monitor, достигает некоторого произвольного числа, но когда он работает, он НЕ освобождает всю используемую память. Это просто не позволяет ему идти намного выше, чем произвольный порог.

Я читал, что GC - это путь, но сейчас я не уверен, и у меня есть почти полностью написанная программа. Любые предложения будут очень полезны. Спасибо!

Ответы [ 2 ]

5 голосов
/ 21 февраля 2011

Сборка мусора действительно работает во всех потоках приложения. Возможно, вы невольно сохранили ссылку на какой-то объект, укоренившийся, таким образом, утечка подграфа; однако без оригинального кода мало что можно сказать.

1 голос
/ 21 февраля 2011

«collectIfNeeded» подразумевает, что он не будет собираться, если сбор не нужен.

Используйте функцию Heapshot инструментов (часть инструмента Allocations), чтобы узнать, какие объекты остались живы, и его Объект.Изобразите инструмент, чтобы узнать, что еще удерживает объекты, которые, по вашему мнению, больше не нужны.

...