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

редактировать

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

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

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

Содержание
  • 1 Objective-C
    • 1.1 Объявление свойств
    • 1.2 Обнуление слабых ссылок
    • 1.3 Преобразование в
  • 2 Swift
  • 3 См. Также
  • 4 Ссылки
  • 5 Внешние ссылки
Objective- C

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

  • сохранить, выпуск, сохранитьCount, автозапускили deallocне могут быть отправлены объектам. Вместо этого компилятор автоматически вставляет эти сообщения во время компиляции, включая [super dealloc], когда deallocпереопределен.
    // Без ARC - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [супер-освобождает]; } // С ARC - (void) dealloc {[[NSNotificationCenter defaultCenter] removeObserver: self]; // [super dealloc] вызывается автоматически}
  • Программы не могут выполнять приведение напрямую между idи void *. Это включает преобразование между объектами 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. Вместо этого ARC использует блоки @autoreleasepool, которые инкапсулируют выделение временных объектов и освобождают их, когда достигается конец блока.
    // Без ARC - (void) loopThroughArray :( NSArray *) массив {для (объекта идентификатора в массиве) {NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Создание множества временных объектов [слив пула]; }} // С ARC - (void) loopThroughArray: (NSArray *) array {for (id объекта в массиве) {@autoreleasepool {// Создаем много временных объектов}}}
  • Программы не могут вызывать функции NSAllocateObjectи NSDeallocateObject
  • Программы не могут использовать указатели на объекты в структурах C (structs)
  • Программы не могут использовать зоны памяти (NSZone)
  • Для правильного взаимодействия с не-ARC кодом, программы не должны использовать никаких методов или объявленных свойств (если явно не выбран другой получатель), которые начинаются с new.

Объявления свойств

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

Без ARCС ARCС ARCLite
сохранитьstrong
назначить(для типов объектов)weakunsafe_unrehibited
copy

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

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

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

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

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

Xcode 4.2 или новее предоставляет способ преобразования кода в ARC. Начиная с 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? // Может быть строкой или нулем, если let myString = myOtherString {// Развернуть необязательный print (myString) // Распечатать строку, если есть}

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

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

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

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-12 19:17:49
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте