@ Кей правильный;история malloc показывает два размещения по указанному адресу;тот, который был выделен и освобожден, и тот, который все еще находится в игре.
Вам нужна обратная трассировка вызова к retainCount
на CALayer
, который уже был освобожден.Поскольку у вас включено обнаружение зомби, помимо прочего, возможно, что освобождение памяти просто не произошло и не произойдет.
Смешивание истории malloc с обнаружением зомби значительно меняет поведение во время выполнения.
Я бы предложил работать с обнаружением зомби в Инструментах.Надеюсь, это точно определит точную проблему.
Если нет, то есть точка останова, которую можно установить, чтобы сломать, когда зомби сообщается.Установите эту точку останова и посмотрите, где вы остановитесь.
ОК - так, CoreAnimation использует счет сохранения для внутренних целей (системные рамки могут с этим справиться, хотя и хрупкими).
Я думаю, что -1 - красная сельдь;вполне вероятно, что зомби вернут 0xFF .... FFFF в качестве счетчика сохраняемых значений, и в инструментах это значение равно -1.
Следующая лучшая догадка;поскольку это происходит по таймеру, переиздание, вероятно, происходит во время анимации.Слои CoreAnimation должны обрабатывать это правильно.В вашем коде есть чрезмерный выпуск контейнера слоя представления или анимации, из-за которого слой преждевременно исчезает.
Вы пробовали "Построить и проанализировать"?Неслучайно это могло бы поймать неумелое управление представлением где-нибудь.
В любом случае и в качестве эксперимента попробуйте сохранить свое представление в течение дополнительного времени и посмотреть, остановит ли это эту проблему.Если это так, то это, по крайней мере, ключ.
(Или это может быть ошибка в системных рамках ... может быть ... но сомнительно.)
Наконец, кто, черт возьми, звонит retainCount
?!?!? В случае CoreAnimation, возможно, что retainCount
используется внутри как деталь реализации.
Если этохотя ваш код, тогда местоположение вызова зомби должно быть довольно очевидным.