Я не знаю, как работает iPhone OS, так что это просто предположение, но в системах, где ни один сборщик мусора не сжимает кучную память, она будет фрагментирована с течением времени. Наличие большого количества свободной памяти не означает, что много свободной памяти свободно.
Например, если вам всегда требуется 4 МБ памяти для некоторой обработки, и у вас есть этот шаблон распределения:
- Выделите 4MB
- выделить 1КБ
- бесплатно 4MB
- Выделить 1КБ
(Вы не освобождаете блоки размером 1 КБ, потому что это результат вычисления или что-то еще)
Вы можете получить только 3 999 КБ свободной непрерывной памяти - поэтому в следующий раз, когда вы выделите 4 МБ, она будет расположена после пропуска, даже если она почти подходит. Это означает, что вы можете исчерпать память, даже если почти вся память (или, скорее, адресное пространство) свободна.
Конечно, современные системы не должны страдать от этой проблемы, но они могут, особенно если приложение никогда не закрывается и не имеет компактного сборщика мусора. Обратите внимание, что некоторые системы имеют кучу с низкой фрагментацией, особенно в таких ситуациях (перераспределение и освобождение блоков одинакового размера), но обычно вам необходимо явно запросить это.