Различное поведение для инструментов распределения (с режимом зомби и без него) - PullRequest
0 голосов
/ 02 июля 2011

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

Так что, на самом деле, я задаюсь вопросом об инструменте распределения, предоставленном один раз в режиме зомби (когда я ищу зомби), и вообще о «обычном» инструменте распределения (выбирается из Memory-> Allocations).

Если я ищу Зомби, инструмент распределения показывает мне совершенно разные номера памяти, выделенные в данный момент (живые байты). С каждым кликом по моему интерфейсу количество активных байтов увеличивается.

Но в обычном окне распределения (Память-> распределения) все кажется (почти абсолютно) нормальным. Таким образом, выделяется 1,13 МБ активных байтов, но это максимум выделенных байтов в отличие от приведенного выше описания, где я могу достичь 4-5 МБ с помощью нескольких кликов на моем пользовательском интерфейсе. Так что мне это кажется странным.

Есть ли что-то большее в Зомби-> Распределении, которое не учитывается в обычном окне размещения?

Примечание: в моей программе нет зомби и утечек.

1 Ответ

2 голосов
/ 02 июля 2011

Насколько я понимаю, функция Zombies должна рассматриваться как взаимоисключающая утечка и распределение объектов в Инструментах.

Фактически, когда вы включаете зомби (директива Instruments или NSZombies), что происходитзаключается в том, что «нормальный» цикл сохранения объектов обманывается, так что вы можете обнаружить попытку использования объекта, который уже был освобожден.В некотором смысле, я не знаю подробностей об этом, но это похоже на то, если счет сохранения увеличивается на единицу, и вы получаете ошибку о попытке использования уже освобожденного экземпляра, когда счет сохранения равен 1Действительно, если счет сохранения мог бы обнуляться, объект был бы освобожден, и в большинстве случаев было бы невозможно обнаружить попытку повторного использования, так как это может произойти в течение длительного времени после освобождения, и этот кусок памяти мог бытьперераспределить на какой-то другой объект.Таким образом, искусственный прирост количества удерживающих устройств позволил бы объекту выжить после его «возможного» освобождения;когда счетчик сохранения становится равным 1, в объекте устанавливается флаг, чтобы среда выполнения знала, что пытается отправить сообщение освобожденному объекту «будет», и вы получаете полное сообщение об ошибке.

Это всего лишь моя ментальная модель, но она позволяет мне объяснить, почему выделение памяти намного выше, когда зомби включены (то есть, потому что объекты не освобождаются, как это было бы в обычном случае).

...