__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
, Майк Эш написал превосходную статью (и реализацию) об обнулении слабых ссылок, которые Вы можете использовать вместо этого.