Подтвердить что ты не робот

Каковы новые квалификаторы нового типа с ARC?

Автоматический подсчет ссылок (ARC) вводит некоторые новые классификаторы типов. Я видел __strong и __weak, но что они делают?

4b9b3361

Ответ 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, который будет работать точно так же, как присваивание, используемое для.