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

Приложения iOS и OS X разработали стратегию владения объектами. Внутренне назначенная система подсчета ссылок отслеживает, сколько владельцев имеет каждый объект. Когда заявлено право собственности на объект, количество ссылок увеличивается на единицу. Обратное также верно. После того, как объект будет освобожден (когда вы закончите работу с объектом), вы уменьшите его счетчик ссылок. Пока счетчик ссылок больше нуля, объект гарантированно существует. Однако, как только счетчик достигает нуля, операционной системе разрешается его уничтожить.

В прошлом разработчики вручную управляли счетчиком ссылок на объект, вызывая специальные методы управления памятью, определенные протоколом NSObject. Это называется снятие с удержания вручную (MRR). Однако в Xcode 4.2 появилась функция Автоматический подсчет ссылок (ARC), которая автоматически вставляет все эти вызовы методов за вас.

Не сбой!

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

Если забыть сбалансировать эти вызовы, результатом будет один из двух результатов: утечка памяти или висящий указатель. Если вы забудете освободить объект, это будет означать, что его базовая память никогда не будет освобождена, что приведет к утечке памяти. Мини-утечки не окажут заметного влияния на вашу программу. Однако, если вы съедите достаточно памяти, ваша программа в конечном итоге выйдет из строя! С другой стороны, если вы попытаетесь освободить объект слишком много раз, у вас будет так называемый висячий указатель. Когда вы пытаетесь получить доступ к висящему указателю, вы запрашиваете неверный адрес памяти, и снова ваша программа, скорее всего, выйдет из строя!

Автоматический подсчет ссылок (ARC)

Автоматический подсчет ссылок - это недавняя разработка Xcode 4.2, которая устраняет необходимость вручную поддерживать жизненные циклы объектов, позволяя компилятору (LLVM) отслеживать. Как оно работает? Добавляя код во время компиляции, программное обеспечение гарантирует, что объекты живут столько, сколько необходимо. ARC работает, потому что среда выполнения знает для каждого объекта, сколько объектов ссылается на него.

Сильный против Слабого

Ссылки между объектами могут быть сильными или слабыми. Сильная ссылка указывает на владение; Сильное свойство - это свойство, при котором счетчик ссылок объекта увеличивается. Ссылающийся объект владеет указанным объектом. Слабая ссылка означает, что ссылающийся объект не владеет указанным объектом. Слабые ссылки не увеличивают счетчик ссылок объекта. Время жизни объекта определяется количеством сильных ссылок на него. Объект не освобождается, пока на него есть сильная ссылка. _weak указывает ссылку, которая не поддерживает работоспособность указанного объекта. Для слабой ссылки устанавливается значение nil, если нет сильных ссылок на объект.

В ARC для типов объектов по умолчанию используется strong. Объект остается «живым» до тех пор, пока на него есть сильный указатель.

Атомный и неатомный

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

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

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

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

Сделайте их атомарными, если вы можете использовать потоки.

Сделайте их неатомарными, если вы знаете, что к ним никогда не будет доступа в многопоточной среде. Таким образом, неатомное значительно быстрее, чем «атомарное».

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