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

Я - новый программист Objective-C, пришедший из C #, VB.NET и т.д. память восстанавливается во время выполнения.

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

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

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

4 голоса | спросил NeboWiki 18 J0000006Europe/Moscow 2009, 00:55:03

3 ответа


0

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

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

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

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

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

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

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

ответил Alex Rozanski 18 J0000006Europe/Moscow 2009, 01:01:05
0

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

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

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

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

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

ответил Lou Franco 18 J0000006Europe/Moscow 2009, 01:00:54
0

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

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

ответил Ryan Detzel 18 J0000006Europe/Moscow 2009, 00:59:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132