__сильное и __слабое размещение ключевых слов - Objective-C - PullRequest
8 голосов
/ 18 января 2012

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

NSObject * __weak weakThing;
__weak NSObject *anotherWeakThing;

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

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

SomeDataType * __weak / __strong

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

Ответы [ 2 ]

13 голосов
/ 18 января 2012

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

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

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

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

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

NSError ** __autoreleasing someObject;

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

6 голосов
/ 07 октября 2013

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

 __weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing;

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

NSObject* one, two;

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

...