Нет, разницы нет. С ключевым словом const
есть несколько вещей, к которым оно может применяться в объявлении; он может применяться к указателю или к значению, на которое указывает указатель.
Спецификаторы владения имеют смысл только для указателей на объекты. Сам объект не может быть «сильным» или «слабым»; это указатель на объект, который является сильным или слабым. ARC имеет смысл только при непосредственном применении к типам указатель на объект и влияет на то, как время жизни этого указателя повлияет на время жизни объекта.
Учитывая, что никогда не существует никакой двусмысленности относительно того, к чему может применяться квалификатор владения, спецификация ARC позволяет размещать квалификатор владения где угодно в определении указателя на объект. Оба ваших примера одинаково верны. Точно так же все следующее означает одно и то же:
NSError * __autoreleasing * someObject;
NSError __autoreleasing ** someObject;
__autoreleasing NSError ** someObject;
Обратите внимание, что компилятор жалуется на это:
NSError ** __autoreleasing someObject;
Это потому, что вы вышли за пределы определения указателя на объект. Вы можете разобрать это как (NSError *)* __autoreleasing someObject;
. К тому времени, когда вы доберетесь до второго *
, вы уже определили тип указателя, поэтому __autoreleasing
не имеет никакого смысла. В любом месте в определении типа указателя все в порядке, но как только вы переходите к типу указатель-указатель, вы ссылаетесь на что-то другое, и это больше не имеет смысла.