__сильное и __слабое размещение ключевых слов - 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;
что, конечно, не будет работать так, как ожидалось).