Автоматический подсчет ссылок (ARC) вводит некоторые новые классификаторы типов. Я видел __strong
и __weak
, но что они делают?
Каковы новые квалификаторы нового типа с ARC?
Ответ 1
__strong
означает, что при присваивании значение r будет сохранено и сохранено в lvalue с использованием примитивной семантики. (Чтобы освободить такой объект, все, что вам нужно сделать, это назначить его nil
, выделенный ранее объект будет освобожден, nil
будет сохранен, что фактически ничего не делает, и он персики и сливки.)
__unsafe_unretained
и __weak
аналогичны в том смысле, что адрес rvalue будет присвоен lvalue, но если вы используете квалификатор __weak
, эта операция гарантированно будет атомарной и подвержена некоторым различным семантика. Один из них заключается в том, что если объект, который назначается, в настоящее время проходит освобождение, то присваивание будет оцениваться до nil
, и оно будет затем автоматически помещено в l-значение выражения. Следовательно, формулировка __unsafe_unretained
, поскольку эта операция действительно небезопасна и не поддерживается.
__autoreleasing
похож на __strong
, за исключением того, что он имеет одно предостережение: сохраненный объект помещается в текущий пул автозавершения, поэтому вы можете, например, получить временное владение объектом, чтобы удалить его из коллекции, а затем вернуть его обратно вызывающему абоненту. Для этого существуют другие виды использования, но в основном они связаны с получением временного владения объектом.
Эти поведения также присутствуют в соответствующих модификаторах свойств (strong
, unsafe_unretained
и weak
).
См. > Автоматическая спецификация технических характеристик Clang Technical
EDIT: Для тех, кто не нацелен на iOS 5 и поэтому не может воспользоваться преимуществами __weak
, Майк Эш написал превосходную статью (и реализации) об обнулении слабых ссылок, которые вы можете использовать вместо этого.
Ответ 2
Сильно говорит ARC сохранить свойство.
@property (strong,nonatomic) NSObject *object;
@property (retain,nonatomic) NSObject *object;
Слабый по существу присваивает, незавершенное свойство. За исключением случаев, когда объект освобождается, слабый указатель автоматически устанавливается на нуль.
@property (weak,nonatomic) NSObject *object;
@property (assign,nonatomic) NSObject *object;
Слабый доступен только на iOS 4.3 и выше. Если вы хотите настроить таргетинг на iOS 4.2, вам нужно использовать unsafe_unretained, который будет работать точно так же, как присваивание, используемое для.
Ответ 3
Отборочные типы __autoreleasing
, __strong
, __unsafe_unretained
и __weak
. Модификаторы свойств: strong
, unsafe_unretained
и weak
.
Посмотрите раздел 4 Автоматического подсчета ссылок в документации LLVM/Clang.