Вот частичный ответ.
В большинстве управляемых языков каждая структура, способная содержать ссылки на другой объект, встраивает информацию, по которой смещение может содержать адрес памяти. Например, в каждом кадре стека есть место, которое сообщает сборщику мусора, где искать адреса.
Языки на основе C, такие как Objective-C, не имеют этого.
Для корректности программы лучше иметь слишком много объектов, чем освобождать объекты слишком рано. Поэтому сборщик мусора в Objective-C ищет шаблоны, которые выглядят как адреса, но не могут точно знать, действительно ли они являются адресами. Это может (и почти неизбежно) приводить к ложным срабатываниям для ссылок (и несовместимо с некоторыми методами управления памятью, которые вы можете использовать с C). Поэтому некоторые объекты могут пережить свою полезность, пока не прекратит свое существование случайное целое число.
Кроме того, как вы говорите, что утечка? Вы просто сравнили след памяти или проверили их с помощью инструмента «Утечки»? Вы пробовали инструмент «GC Monitor»?