iOS Leak Tool против Activity Monitor

Я отлаживаю приложение для iPhone, которое было написано кем-то другим, оно не использует дугу. Я пытался использовать arc, но у них есть много старого кода, который использует некоторые указатели v в стиле c, поэтому программа вылетает, когда я это делаю.

Я отказался от этой идеи как безнадежного дела. Проблема заключается в том, что инструменты выделения / утечки не показывают утечку памяти, но монитор активности показывает утечку памяти каждый раз, когда пользователь проводит пальцем, чтобы изменить страницу. (около 1,5 мегабайта) Нет необходимости говорить, что программа вылетает.

Будучи самим программистом на С ++, имея некоторый объективный опыт работы с языком программирования, я не понимаю всех тонкостей, в которых хранится память. Может кто-нибудь дать мне несколько советов о том, как отследить это.

Спасибо

1 ответ

Я настоятельно рекомендую провести один день и внимательно прочитать Руководство по программированию Objective-C (разделы "Сохранить / отпустить / автоматически выпустить"), пока оно не защелкнется. Также свойства, которые почти наверняка в игре здесь.

В частности, некоторая память была сохранена либо слишком большим количеством сохранений, либо установщиком свойств, выполняющим это в качестве побочного эффекта, либо представлением, удерживающим элементы пользовательского интерфейса (скрывающимся, но не удаляемым из его суперпредставления).

В представлении Распределение инструментов вы можете видеть типы объектов, которые не освобождаются - это должно помочь отследить его.

Другой трюк заключается в том, чтобы поместить операторы log в методы dealloc, чтобы увидеть, какие крупные объекты НЕ освобождаются (нет операторов log в консоли).

Ваш последний вариант - либо опубликовать свой код и попросить о помощи здесь, либо нанять кого-то, кто поможет вам пройти через это или ARCify.

РЕДАКТИРОВАТЬ: У меня была идея на выходных о том, как можно отслеживать произвольные объекты - чтобы получить представление о том, были ли они выпущены или нет, поэтому я создал проект Object Tracker. С использованием Tracker класс, вы можете пометить объекты для отслеживания, и когда объект будет освобожден, вы увидите сообщение журнала в Xcode. Кроме того, вы можете запросить объект класса, чтобы увидеть, какие объекты все еще живут.

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

Таким образом, вы можете попробовать несколько объектов в вашем проекте - views, scrollViews, изображения, массивы и т. Д., И посмотреть, сможете ли вы хотя бы найти объект, который не освобождается, когда он должен быть.

Надеюсь это поможет.

Другие вопросы по тегам