__сильное и __слабое размещение ключевых слов - Objective-C

Компилятор, похоже, не имеет проблем с двумя следующими объявлениями:

NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;

Есть ли разница между ними? Поведение похоже на ключевое слово const?

Я спрашиваю, потому что предупреждение XCode вообще предлагает...

SomeDataType * __weak / __strong

... когда ты что-то обманываешь. Поэтому я пытался следовать этой схеме, но задавался вопросом, была ли вообще разница.

2 ответа

Решение

Нет, разницы нет. С const ключевое слово, есть несколько вещей, к которым оно может применяться в объявлении; он может применяться к указателю или к значению, на которое указывает указатель.

Спецификаторы владения имеют смысл только для указателей на объекты. Сам объект не может быть "сильным" или "слабым"; это указатель на объект, который является сильным или слабым. ARC имеет смысл только при непосредственном применении к типам указатель на объект и влияет на то, как время жизни этого указателя повлияет на время жизни объекта.

Учитывая, что никогда не существует никакой двусмысленности относительно того, к чему может применяться квалификатор владения, спецификация ARC допускает размещение спецификатора владения в любом месте определения указателя на объект. Оба ваших примера одинаково верны. Кроме того, все следующее означает одно и то же:

NSError * __autoreleasing * someObject;
NSError __autoreleasing ** someObject;
__autoreleasing NSError ** someObject;

Обратите внимание, что компилятор жалуется на это:

NSError ** __autoreleasing someObject;

Это потому, что вы вышли за пределы определения указателя на объект. Вы можете разобрать это как (NSError *)* __autoreleasing someObject;, К тому времени, как вы доберетесь до второго *Вы уже определили тип указателя, поэтому __autoreleasing не имеет никакого смысла. В любом месте в определении типа указателя все в порядке, но как только вы переходите к типу указатель-указатель, вы ссылаетесь на что-то другое, и это больше не имеет смысла.

Есть разница, если у вас есть

 __weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing;

потому что __weak применяется только к первой переменной. (это аналогичная ошибка новичка

NSObject* one, two;

что, конечно, не будет работать так, как ожидалось).

Другие вопросы по тегам