Objective-c и утечки памяти после завершения программы? - PullRequest
4 голосов
/ 18 июня 2009

Я - новый программист Objective-C, пришедший из C #, VB.NET и т. Д. Это все языки сборки мусора, и по большей части худшее, что вы можете сделать, это злоупотребить использованием памяти, потому что, когда ваша программа закрывается память восстанавливается во время выполнения.

Тем не менее, я не совсем уверен в Objective-C. Я понимаю, что по большей части нам, как разработчику, нужно управлять распределением, инициализацией, хранением и освобождением объектов. Я стараюсь изо всех сил, чтобы сделать это, и медленно думаю, что я понимаю это.

Мое беспокойство таково: я не уверен, правильно ли я понимаю термин «утечка памяти». Относится ли это к неправильному освобождению памяти, а затем, когда мое приложение закрывается, остается неиспользуемая висящая память? Другими словами, когда моя программа закрывается, Mac OS не гарантирует, что все, что использовала программа, очищено?

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

Ответы [ 3 ]

3 голосов
/ 18 июня 2009

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

Нет; утечка памяти - это утечка памяти , в то время как приложение все еще работает, поскольку OS X освобождает всю память, когда приложение завершается. Если это не так, это может вызвать огромные проблемы из-за плохого кодирования и управления памятью и повлиять на всю систему.

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

NSMutableArray *array; //Pointer to some already allocated array

[array addObject:someObject];
[someObject release];

При условии, что someObject был выделен правильно, он начнется с счетчика сохранения 1. Когда вы добавляете объекты в массив, массив вызывает retain для рассматриваемого объекта, увеличивая его, в данном случае, до 2.

Когда массив освобождается, он отправляет release всем своим объектам; в этом сценарии счет сохранения будет уменьшен до 1 (при условии, что никто другой не сохранил объект). Это не 0, поэтому someObject все еще существует. Если бы someObject был локальным указателем, созданным внутри метода, и у вас больше не было указателя на этот объект, тогда память зависла бы там. Это пример утечки памяти, которая заставляет ваше приложение использовать больше памяти, чем требуется , и будет страдать до тех пор, пока не прекратится.

1 голос
/ 18 июня 2009

ОС освобождает память, но до тех пор вы можете просочиться. Поэтому, если вы получаете отчет об утечках при завершении работы, это просто объекты, которые еще не были освобождены (но память теперь восстановлена).

Я написал запись в блоге о понимании управления памятью target-c для iPhone.

http://loufranco.com/blog/files/managing-memory-iphone.html

и это на инструменте статического анализа CLang, который я нашел бесценным для обнаружения утечек, исследуя источник

http://loufranco.com/blog/files/scan-build-iphone.html

0 голосов
/ 18 июня 2009

Нет, ОС должна освободить всю память при выходе из приложения. Утечки памяти приведут к падению ВАШЕГО приложения, если его не обработать. Проще говоря, устройства имеют 10 Мб оперативной памяти, и вы продолжаете терять память каждый раз, когда вызываете функцию. Рано или поздно у вас кончится оперативная память, и ваше приложение рухнет.

Apple предоставляет отличный инструмент «Инструменты», который позволяет отслеживать и устранять утечки памяти. Я советую вам время от времени запускать ваше приложение для проверки на утечки. Я дошел до того, что всегда нахожу место, где собираюсь выпустить объект, когда вызываю alloc. Если я вызываю alloc, а это не autorelease, тогда я должен найти место для размещения релиза.

...