2012-06-03 3 views
2

Когда не отбрасывая вокруг (не каламбур), чтобы уточнить, когда использовать __strong в объявлении переменной я наткнулся на эти строки в Transitioning to ARC Release Notes:Что означает документация Apple, когда речь идет о правильном месте для включения атрибутов ARC?

Вы должны правильно декорировать переменные. При использовании классификаторов в объявлении переменной объекта, правильный формат:

ClassName * qualifier variableName; 

, например:

MyClass * __weak myWeakReference;  
    MyClass * __unsafe_unretained myUnsafeReference; 

Другие варианты являются технически неправильно, но «простили» компилятором. Чтобы понять проблему, см. http://cdecl.org/.

Я подозреваю, что это какая-то шутка от Apple, но я не думаю, что получу ее. Это явно не имеет значения, но я хотел бы сделать это правильно. Какова важность правильного «оформления» объявления переменной и какой смысл пытаться сделать cdecl.org?

Edit: уточнить, я хочу понять, почему именно писать

qualifier ClassName * variableName; 

является "технически неправильно."

ответ

2

Итак, я думаю, что у меня есть ответ, но я не могу быть уверен, что я прав. Не стесняйтесь предлагать лучшее, или комментировать/повышать, если вы думаете, что я прибил его.

CDecl - это программа на C, которую вы можете скачать с того же сайта. Он существует для решения таких проблем, как в this question.

Переменные объявления в C могут быть довольно печально известны, особенно если учитывать typedefs. Существует хорошее введение в этот over at Unixwiz.net. Вы найдете там полезное введение, которое позволит вам читать даже таких монстров, как char *(*(**foo [][8])())[]; (foo is array of array of 8 pointer to pointer to function returning pointer to array of pointer to char).

Правило с ними - это фактически близость. Рассмотрим простой пример

const int * foo 

Это объявляет foo как указатель на константу int. Однако

int * const foo 

будет объявлять foo как постоянный указатель на int. Тонкая разница обсуждается полностью in this question. (по сути, в первом примере вы можете сделать foo точкой для другой константы int, но не можете изменить константу int через foo; во втором вы можете изменить int, на который указывает foo, но вы можете 't make foo указывает на любое другое место в памяти).

С этими атрибутами ARC, синтаксис использования

__strong NSString * myString 

объявят MyView как указатель на «сильный» UIView. Это бессмысленно. Только указатели на объекты могут иметь атрибут быть сильным (или слабым или каким-либо другим) в ARC.Поэтому рекомендуется набирать

NSString * __strong myString 

так как это соответствует другим ключевым словам C.

я спрашиваю себя: что происходит под АРК, если вы объявите сильный указатель на объект на слабый указатель на объект, чтобы, скажем, NSString, как так

NSString * __weak * __strong myContrivedPointer; 

, но то же самое относится. Эти ключевые слова могут содержать только указатель объекта. Следовательно, бессмысленно объявлять указатель на указатель «сильный».

Смежные вопросы