Какой самый лучший способ выяснить, кто увеличил retainCount до 3?
Это приближается к проблеме под неправильным углом. Это будет вводить вас в заблуждение, а будет вводить вас в заблуждение (и, вероятно, прямо за) реальной проблемой, когда она действительно существует.
Лучше подумать о , которому принадлежит объект. Намереваетесь ли вы сохранить объект как значение одного из ваших собственных свойств? Если это так, то вы один из его владельцев. Если нет, то нет. Если вы передаете объект другому объекту для хранения в одном из его свойств, то этот другой объект также является владельцем.
Эти права собственности - это просто отношения, поэтому действительно легко держать их прямо в голове.
- «Это один из моих контролеров. Ему принадлежат корневые объекты моей модели и один или несколько видов [контроллеров]. ”
- «Это вид. Ему принадлежат некоторые части моей модели. ”
- «Это часть моей модели. Он владеет только примитивными объектами. ”
- «Это еще одна часть моей модели. Ему принадлежат некоторые примитивные объекты и некоторые другие кусочки модели ».
Если у вас есть четкое представление о ваших правах собственности, то вы не можете записать утечку памяти, кроме как, забыв сообщение release
или autorelease
(которое может случиться с кем угодно), и вы почти конечно, не пишите циклическое удержание (два объекта, сохраняющие друг друга), кроме как сознательно и с обильными комментариями и # предупреждениями.
Если вы не проработали свои права собственности, то, возможно, вы написали одну или несколько утечек памяти или циклических задержек, о которых вы не знаете.
Редактировать: И чтобы ответить на реальный вопрос, лучший способ выяснить, что сохранило - и, возможно, впоследствии автоматически освободил - объект - это использовать инструмент Распределения инструментов . С его помощью вы можете просмотреть историю любого объекта, чтобы увидеть каждое выделение, сохранение, автоматическое освобождение, освобождение и освобождение его адреса.