Управление памятью

Cocoa

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

Cocoa memory management

С Первого Взгляда

Objective-C предоставляет три метода управления памятью:

  1. В методике, описанной в данном руководстве, называемой "manual retain-release" (ручное сохранение-освобождение) или MRR, вы явно управляете памятью, отслеживая объекты, которые у вас есть. Это реализуется с помощью модели, известной как подсчет ссылок, что Foundation класса NSObject обеспечивает совместно со средой выполнения.
  2. В Automatic Reference Counting (автоматическом подсчете ссылок), или ARC, система использует тот же подсчет ссылок, что и система MRR, но он вставляет соответствующий вызов метода управления памятью за вас во время компиляции. Вам настоятельно рекомендуется использовать ARC для новых проектов. Если вы используете ARC, обычно нет необходимости, понимать внутреннюю реализацию описанную в этом документе, хотя она может быть полезной в некоторых ситуациях.
  3. В garbage collection (сборе мусора), система автоматически отслеживает, какие объекты владеют другими объектами. Затем она автоматически освобождает (или собирает мусор) объекты, на которые больше не ссылаются. Метод использует другой механизм, нежели, чем у используемых в MRR и ARC, и поддерживается только в среде выполнения на Mac OS X, а не IOS.

Если вы планируете писать код для IOS, вы должны использовать явное управление памятью (предмет данного руководства). Кроме того, если вы планируете создавать библиотеки подпрограмм, плагины, или общий код, который может быть загружен в любом процессе со сборкой мусора или без сбора мусора, вы можете написать свой код с помощью методов управления памятью, описанных в этом руководстве. (Убедитесь, что вы затем проверите код в Xcode, со сборкой мусора выключенной и включенной.)

Практика Предотвращения Проблем при Работе с Памятью

Существуют две основные проблемы, возникающие в результате неправильного управления памятью:

  1. Освобождение или перезапись данных, которые используются до сих пор

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

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

    Утечка памяти это выделенная и не освобожденная память, которая больше не используется, что в свою очередь приводит к все большему выделению памяти и как результат - снижение производительности системы, а в случае с IOS и вылет приложения

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

close

Объект граф (Object graph)

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

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

См. Управление политикой памяти

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

См. Практическое управление памятью

Autorelease pools (Автоматические пулы) обеспечивают механизм, посредством которого вы можете отправить объекту "отложенное" release сообщение. Это полезно в ситуациях, когда вы хотите отказаться от права владения объектом, но хотите, избежать ситуации когда объект освобождается сразу (например, когда вы возвращаете объект из метода). Есть случаи, когда вы можете использовать ваши собственные autorelease pools.

См. Использование Autorelease pools

Используйте Инструменты Анализа для Отладки Проблем с Памятью

Для выявления проблем с вашим кодом во время компиляции, вы можете использовать Clang Static Analyzer (Статический анализатора кода), который встроен в Xcode.

close

Работа статического анализатора кода

Шаги

  1. Выберите в меню Product > Analyze.
  2. Выберите analyzer message в навигаторе сообщений об ошибках
  3. Нажмите соответствующее сообщение в редакторе исходного кода.
  4. Используйте всплывающее меню в строке результатов анализа выше области редактирования, чтобы изучить причины недостатка.
  5. Отредактируйте код, для исправления недостатков
 

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

Xcode статический анализатор разбирает исходный код проекта и определяет типы проблем:

  1. Логические ошибки, такие как доступ к неинициализированным переменным и разыменование нулевых указателей
  2. Недостатки управления памятью , такие как утечка выделенной памяти
  3. Неиспользуемые переменные
  4. Недостатки, используемого API, не следующего политике используемых Frameworks и библиотек

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

Заметим, что если статический анализатор сообщает об отсутствии проблем, это не означает, что их нет.Инструмент не может обнаружить все недостатки в исходном коде.

Если проблемы управления памятью все-таки возникают, есть другие средства и методы, которые можно использовать для выявления и диагностики проблем.

Вы можете использовать инструменты для отслеживания подсчета ссылок событий и искать утечки памяти. См. "Просмотр и анализ данных трассировки".

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac