XCode / Instruments не показывает утечки памяти - PullRequest
9 голосов
/ 21 июля 2011

Я слежу за лекциями по разработке для Stanford iOS, и у меня есть мозговой класс Calculator, который был alloc init в контроллере, но у меня нет release d в dealloc.

- (CalculatorBrain *)brain
{
    if (!brain) 
        brain = [[CalculatorBrain alloc] init];

    return brain;

}

Я бежал из XCode -> Запустить с Performance Tool, и приложение запустилось, и никаких утечек не появилось, затем я нажал кнопку «Домой» в iOS Simulator и ничего, затем я дважды щелкнул кнопку «Домой» и закрыл приложение и все еще ничего.

Я также делал Build & Analyze, и он ничего не заметил

Не могли бы вы дать мне знать, почему он не поднимает его?

Ответы [ 3 ]

6 голосов
/ 24 июля 2011

Похоже, что нет обнаруживаемой утечки.Посмотрите на эту строку:

brain = [[CalculatorBrain alloc] init];

Пока brain указывает на объект, этот объект не будет считаться "утечкой памяти".Если в какой-то момент вы сделаете это,

brain = nil;

Тогда утечка будет зарегистрирована.Отмена выделения объекта-контейнера также приведет к этому, но вы уверены , что он был освобожден?(Например, он не будет освобожден при выходе из программы.)

Проблема: Детекторы утечек не могут обнаружить все утечки памяти - это математическидоказанный факт.Большинство детекторов обнаруживают только недоступные объекты, а многие детекторы утечек особенно чувствительны к ложным отрицаниям - в C трудно определить разницу во время выполнения между указателем и целым числом.

Редактировать: Похоже, ваше приложение только когда-либо создает один экземпляр контроллера, который создает только один экземпляр CalculatorBrain.Если вы думаете о том, что на самом деле утечка памяти составляет , вы можете определить ее как неиспользуемую память, которую ваша программа не освобождает обратно в операционную систему.

  • Во время работы программы, CalculatorBrain всегда используется и поэтому не является утечкой.
  • При выходе из программы операционная система автоматически восстанавливает всю память, используемую вашим процессом, поэтому не может быть никаких утечек памяти после выхода из программы.

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

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

0 голосов
/ 24 июля 2011

Хорошо ... это правда, что утечки не могут обнаружить все утечки памяти, но допустим, что вы делаете это:

myIvarBrain=[self brain];

Если вы отдаете его в iVar (выпущенный в списке дел вашего класса и без аксессоров), на самом деле утечки вообще нет. Возвращенный RC - один, и он будет один после освобождения вашего класса. Если вы не освобождаете его в dealloc, вам следует подождать до тех пор, пока в вашем классе не появится утечка памяти. Имеет ли смысл?

0 голосов
/ 24 июля 2011

Анализатор не может найти все утечки памяти. Что касается сохранения экземпляра в ivar, то он не вытекает из этого метода, а затем в dealloc не понимает, что ivar должен быть освобожден. Я не помню, чтобы XCode 4 улучшился в этом отношении (я все еще использую XCode 3).

Что касается инструмента повышения производительности, помните, что объект не будет считаться утечкой, пока ничто больше не будет содержать ссылку на него. Таким образом, даже если ваш контроллер не освобождает мозг, мозг не будет считаться протекшим, пока контроллер не будет освобожден (или не получит пересадку мозга). Также обратите внимание, что в * nix-подобных системах выделение памяти автоматически очищается при выходе из процесса. Так что на самом деле это не утечка, если вы выделяете память для объектов, которые должны существовать на протяжении всего времени вашего процесса (например, делегат приложения и все, что оно постоянно удерживает), и полагаетесь на это поведение, чтобы освободить его при выходе из процесса.

...