Какие новые классификаторы типов введены в ARC? - PullRequest
17 голосов
/ 31 октября 2011

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

Ответы [ 3 ]

32 голосов
/ 31 октября 2011

__strong означает, что при присваивании r-значение выражения будет сохранено и сохранено в l-значении с использованием примитивной семантики. (Чтобы освободить такой объект, все, что вам нужно сделать, это присвоить ему nil, ранее упомянутый объект будет освобожден, nil будет сохранено, что фактически ничего не делает, и это персики и сливки.)

__unsafe_unretained и __weak похожи в том смысле, что адрес r-значения будет назначен l-значению, но если вы используете квалификатор __weak, эта операция гарантированно будет атомарной и подвергнется некоторому другому семантика. Одним из них является то, что, если назначаемый объект в настоящее время подвергается освобождению, тогда присвоение оценивается как nil, и оно затем будет атомарно сохранено обратно в l-значение выражения. Отсюда формулировка __unsafe_unretained, потому что эта операция действительно небезопасна и не сохраняется.

__autoreleasing похож на __strong, за исключением того, что имеет одно предупреждение: сохраненный объект помещается в текущий пул автоматического выпуска, поэтому вы можете, например, получить временное владение объектом, чтобы удалить его из коллекции, а затем вернуть его обратно для звонящего. Для этого есть и другие применения, но они в основном связаны с получением временного владения объектом.

Это поведение также проявляется в соответствующих модификаторах свойств (strong, unsafe_unretained и weak).

См. Техническую спецификацию автоматического подсчета ссылок Clang

РЕДАКТИРОВАТЬ: Для тех, кто не ориентируется на iOS 5 и поэтому не может воспользоваться преимуществами __weak, Майк Эш написал превосходную статью (и реализацию) об обнулении слабых ссылок, которые Вы можете использовать вместо этого.

4 голосов
/ 31 октября 2011

Стронг приказывает 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, это будет работать точно так же, как и для assign.

1 голос
/ 31 октября 2011

Квалификаторы типов: __autoreleasing, __strong, __unsafe_unretained и __weak. Модификаторы свойств: strong, unsafe_unretained и weak.

Взгляните на раздел 4 Автоматический подсчет ссылок в документации LLVM / Clang.

...