Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

Objective-C [ править ]

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

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

Декларации собственности [ править ]

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

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

Обнуление слабых ссылок [ править ]

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

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

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

Преобразование в [ редактировать ]

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

Swift [ править ]

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

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

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

var  strongReference :  MyClass  // Сильная ссылка, не может быть nil weak  var  weakReference :  MyClass ?  // Слабые ссылки, может быть нулевым несобственным  вар  unownedReference :  MyClass  // Слабые ссылки, не может быть нулевым

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" . Яблоко, Inc . Проверено 14 октября 2013 .
  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. ^ a b c d e f g h «Переход на версию ARC» . Проверено 14 сентября 2012 года .
  10. ^ «Что нового в Xcode 4.2 - Автоматический подсчет ссылок» . Корпорация Apple Архивировано из оригинала 20 августа 2012 года . Проверено 3 октября 2012 года .
  11. ^ «Типы значений и ссылок» . Разработчик Apple . 15 августа 2014 . Проверено 17 ноября, 2016 .

Внешние ссылки [ править ]

  • Переход на ARC - Библиотека разработчика iOS
  • « Автоматический подсчет ссылок » на языке программирования Swift