Шаблон проектирования для улавливания утечек памяти в target-c? - PullRequest
1 голос
/ 24 января 2012

Я прочитал руководство по управлению памятью от Apple и думаю, что понимаю правила, которые необходимо соблюдать для обеспечения надлежащего управления памятью в моем приложении.

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

Имеет ли смысл создавать какой-то глобальный объект, который присутствует повсюдувыполнение приложения, которое содержит количество активных объектов типа?Каждый объект может увеличивать количество своего типа в своем методе init и уменьшать его в dealloc.Глобальный объект может проверить в подходящее время, если счет конкретного типа равен нулю или нет.

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

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

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Каждый объект может увеличить счетчик своего типа в методе init и уменьшить его в dealloc.

Чтобы сделать это правильно, вам нужно будет выполнить одно из следующих действий.: 1) переопределить поведение в некоторой общей точке, такой как -init или NSObject's, или 2) добавить соответствующий код к назначенному инициализатору каждого отдельного класса.Ни то, ни другое не кажется простым.

Глобальный объект может в подходящее время проверить, является ли счет конкретного типа нулем или нет.

Звучит хорошо, но не могли бы вы уточнитьНемного о "подходящем времени"?Как бы вы узнали в любой момент жизни вашей программы, какие классы должны иметь ноль экземпляров?У вас была бы довольно хорошая идея, что в конце программы не должно быть никаких объектов, но Instruments может сказать вам то же самое в этом случае.

Objective-C предпринял несколько шагов для управления памятьюнамного прощеИспользуйте свойства и синтезированные методы доступа, где это возможно, поскольку они по существу управляют вашими объектами за вас.Более недавнее усовершенствование - ARC, которое идет еще дальше к автоматизации большинства задач управления памятью.Вы в основном позволяете компилятору выяснить, куда помещать вызовы управления памятью - это похоже на сборку мусора без сборщика мусора.Научитесь хорошо использовать эти инструменты, прежде чем пытаться изобретать новые.

1 голос
/ 24 января 2012

Не идите по этому пути ... это боль в одиночном наследстве. Самое главное, в вашем распоряжении есть отличные инструменты, которые вы должны освоить, прежде чем думать, что вам нужно создать какой-то глобальный счетчик. Глобальный счетчик уже существует в нескольких инструментах - Узнайте их!

Способ борьбы с ним заключается в том, чтобы научиться правильно балансировать и управлять всем, когда оно написано. Оглядываясь назад, это действительно очень просто.

ARC - это еще один вариант - на самом деле это просто откладывает ваше понимание.

Первый «шаблон дизайна» Я рекомендую использовать release вместо autorelease, где это возможно (хотя, как правило, более полезно для перепроизводства).

Затем регулярно запускайте инструмент утечки / утилиту и немедленно устраняйте все утечки / зомби.

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

...