Автоматический подсчет ссылок - Automatic Reference Counting

Автоматический подсчет ссылок (ARC) это управление памятью особенность Лязг компилятор обеспечение автоматического подсчет ссылок для Цель-C и Быстрый языки программирования. Во время компиляции он вставляется в объектный код Сообщения удерживать и релиз[1][2] которые увеличивают и уменьшают счетчик ссылок во время выполнения, отмечая для освобождение те объекты когда количество обращений к ним достигает нуля.

ARC отличается от трассировки вывоз мусора в этом нет фонового процесса, который освобождает объекты асинхронно во время выполнения.[3] В отличие от трассировки сборки мусора, ARC не обрабатывает ссылочные циклы автоматически. Это означает, что пока существуют «сильные» ссылки на объект, он не будет освобожден. Соответственно сильные перекрестные ссылки могут создавать тупиковые ситуации и утечки памяти. Разработчик должен разорвать циклы, используя слабые ссылки.[4]

Apple Inc. развертывает ARC в своих операционных системах, таких как macOS (OS X) и iOS. Ограниченная поддержка (ARCLite)[5] был доступен с Mac OS X Снежный барс и iOS 4, с полной поддержкой после Mac OS X Лев и iOS 5.[6] Сборка мусора была объявлена ​​устаревшей в OS X Горный лев, в пользу ARC и удален из Objective-C библиотека времени исполнения в macOS Sierra.[7][8]

Цель-C

Когда ARC включен, компилятор применяет следующие правила:

  • удерживать, релиз, keepCount, автоматический выпуск или же освобождать нельзя отправлять на объекты. Вместо этого компилятор автоматически вставляет эти сообщения во время компиляции, включая [супер-освобождение] когда освобождать отменяется.[9]
    // Без ARC- (пустота)освобождать{   [[NSNotificationCenter defaultCenter] removeObserver:себя];   [супер освобождать];}// С ARC- (пустота)освобождать{   [[NSNotificationCenter defaultCenter] removeObserver:себя];   // [super dealloc] вызывается автоматически}
  • Программы не могут транслировать напрямую между я бы и пустота *.[9] Это включает преобразование между объектами Foundation и объектами Core Foundation. Программы должны использовать специальные преобразования типов или вызовы специальных функций, чтобы сообщить компилятору больше информации о времени жизни объекта.
    // Без ARC- (NSString *)giveMeAString{    CFStringRef myString = [себя someMethodThatCreatesACFString];    NSString *newString = (NSString *)myString;    возвращаться [newString автоматический выпуск];}// С ARC- (NSString *)giveMeAString{    CFStringRef myString = [себя someMethodThatCreatesACFString]; // счетчик удержания равен 1    NSString *newString = (__bridge_transfer NSString *)myString; // право собственности теперь передано в ARC    возвращаться newString;}
  • Пул с автоматическим освобождением может использоваться для временного выделения объектов и сохранения их в памяти до тех пор, пока пул не будет «истощен». Без ARC NSAutoreleasePool для этого может быть создан объект. ARC использует @autoreleasepool вместо этого блоки, которые инкапсулируют выделение временных объектов и освобождают их, когда достигается конец блока.[9]
    // Без ARC- (пустота)loopThroughArray:(NSArray *)множество{    за (я бы объект в множество) {        NSAutoreleasePool *бассейн = [[NSAutoreleasePool выделить] в этом];        // Создаем много временных объектов        [бассейн осушать];    }}// С ARC- (пустота)loopThroughArray:(NSArray *)множество{    за (я бы объект в множество) {        @autoreleasepool {            // Создаем много временных объектов        }    }}
  • Программы не могут вызывать функции NSAllocateObject и NSDeallocateObject[9]
  • Программы не могут использовать указатели на объекты в структурах C (структураs)[9]
  • Программы не могут использовать зоны памяти (NSZone)[9]
  • Чтобы правильно взаимодействовать с кодом, отличным от ARC, программы не должны использовать никаких методов или объявленных свойств (если явно не выбран другой получатель), которые начинаются с новый.[9]

Декларации собственности

ARC вводит некоторые новые атрибуты объявления свойств, некоторые из которых заменяют старые атрибуты.

Без ARCС ARCС ARCLite [Примечание 1]
удерживатьсильный
назначать (для типов объектов)слабыйunsafe_unreolated
копировать
  1. ^ ARCLite - это ARC, но без обнуление слабых ссылок (используется при развертывании в менее производительной операционной среде, чем требуется для ARC).

Обнуление слабых ссылок

Обнуление слабых ссылок - это функция в Objective-C ARC, которая автоматически очищает (устанавливается на ноль) локальные переменные со слабыми ссылками, переменные экземпляра и объявленные свойства непосредственно перед тем, как объект, на который указывает, начинает освобождаться. Это гарантирует, что указатель перейдет либо на действительный объект, либо на ноль, и избегает висячие указатели. До введения этой функции «слабые ссылки» относились к ссылкам, которые не сохранялись, но не были установлены для ноль когда объект, на который они указывали, был освобожден (эквивалентно unsafe_unreolated в ARC), что может привести к зависанию указателя. Обычно программист должен был убедиться, что все возможные слабые ссылки на объект были установлены на ноль вручную при его освобождении. Обнуление слабых ссылок устраняет необходимость в этом.

Обнуление слабых ссылок указывается с помощью объявленный атрибут свойства слабый или с помощью атрибута переменной __слабый.

Обнуление слабых ссылок доступно только в Mac OS X Lion (10.7) или новее и iOS 5 или новее, потому что они требуют дополнительной поддержки со стороны среды выполнения Objective-C. Однако некоторые классы OS X в настоящее время не поддерживают слабые ссылки.[9] Код, который использует ARC, но должен поддерживать версии ОС, более старые, чем указанные выше, не может использовать обнуление слабых ссылок, и поэтому должен использовать unsafe_unreolated слабые ссылки. Существует сторонняя библиотека под названием PLWeakCompatibility. [1] что позволяет использовать обнуление слабых ссылок даже на этих старых версиях ОС.

Преобразование в

Xcode 4.2 или новее предоставляет способ преобразования кода в ARC.[10] Начиная с Xcode 4.5, его можно найти, выбрав Edit> Refactor> Convert to Objective-C ARC ... Хотя Xcode автоматически конвертирует большую часть кода, некоторые коды, возможно, придется преобразовать вручную. Xcode сообщит разработчику, когда возникают более сложные варианты использования, например, когда переменная объявляется внутри пула автозапуска и используется за его пределами, или когда два объекта необходимо бесплатно соединить с помощью специальных преобразований.

Быстрый

В Swift ссылки на объекты сильны, если они не объявлены слабый или же бесхозный. Swift требует явной обработки nil с необязательным типом: тип значения, который может иметь значение или быть nil. Необязательный тип необходимо обрабатывать, "разворачивая" его с помощью Условный оператор, позволяющий безопасно использовать значение, если оно есть. И наоборот, любой необязательный тип всегда будет иметь значение и не может быть нулевым.

вар myString: Нить                   // Может быть только строкойвар myOtherString: Нить?             // Может быть строкой или нулемесли позволять myString = myOtherString {      // Разворачиваем необязательный    Распечатать(myString)                    // Выводим строку, если она есть }

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

вар strongReference: Мой класс          // Сильная ссылка, не может быть нулемслабый вар weakReference: Мой класс?      // Слабая ссылка, может быть нулембесхозный вар unownedReference: Мой класс // Слабая ссылка, не может быть нулем

Swift также отличается от Objective-C использованием и поощрением типы значений вместо ссылочные типы. Большинство типов в стандартной библиотеке Swift являются типами значений и копируются по значению, тогда как классы и закрытие являются ссылочными типами и передаются по ссылке. Поскольку типы значений копируются при передаче, они автоматически освобождаются со ссылкой, которая их создала.[11]

Смотрите также

Рекомендации

  1. ^ Сиракуза, Джон (20 июля 2011 г.). «Mac OS X 10.7 Lion: обзор Ars Technica». Ars Technica. Ars Technica. В разделе «Автоматический подсчет ссылок». Получено 17 ноября, 2016.
  2. ^ Кочан, Стивен Г. (2011). Программирование на Objective-C (4-е изд.). Бостон, Массачусетс: Аддисон-Уэсли. стр.408. ISBN  978-0321811905.
  3. ^ Хоффман, Кевин (2012). Самс научится разрабатывать приложения для Mac OS X Lion за 24 часа. Индианаполис, штат Индиана: Самс. стр.73. ISBN  9780672335815.
  4. ^ "Общий". Автоматический подсчет ссылок. LLVM.org. Получено 15 августа 2012.
  5. ^ «Индекс доступности функций Objective-C». Apple, Inc. Получено 2013-10-14.
  6. ^ Сакамото, Кадзуки (2012). Многопоточность и управление памятью Pro для iOS и OS X с помощью ARC, Grand Central Dispatch и Blocks. Апресс. стр. xii. ISBN  978-1430241164.
  7. ^ Сиракуза, Джон (25 июля 2012 г.). «OS X 10.8 Mountain Lion: обзор Ars Technica». Ars Technica. В разделе «Улучшения Objective-C». Получено 17 ноября, 2016.
  8. ^ «Примечания к выпуску Xcode 8». Разработчик Apple. 27 октября 2016 г. Архивировано с оригинал 19 марта 2017 г.. Получено 19 марта, 2017.
  9. ^ а б c d е ж грамм час «Переход к примечаниям к версии ARC». Получено 14 сентября 2012.
  10. ^ «Что нового в Xcode 4.2 - автоматический подсчет ссылок». Apple Inc. Архивировано с оригинал 20 августа 2012 г.. Получено 3 октября 2012.
  11. ^ «Типы значений и ссылок». Разработчик Apple. 15 августа 2014 г.. Получено 17 ноября, 2016.

внешняя ссылка