在this document中,在标有“变量限定符”的部分下,Apple说:
您应该正确装饰变量。在对象变量声明中使用限定符时,正确的格式为:
ClassName * qualifier variableName;
例如:
MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;
其他变体在技术上是不正确的,但编译器“原谅”了。要了解此问题,请参阅http://cdecl.org/。
查看cdecl.org并未澄清任何内容。任何人都可以解释他们所指的“问题”是什么?换句话说,帮助我说服其他人,这实际上不仅仅是因为“因为这个自述文件是这么说的。”
答案 0 :(得分:6)
查看我的例子,带有乱码到英文的翻译
众所周知
ClassName * const varName; //varName is a constant pointer to ClassName
与
有不同的含义const ClassName * varName; //varName is a pointer to constant ClassName
或
ClassName const * varName; //varName is a pointer to constant ClassName
以同样的方式宣言
ClassName * __weak varName; //varName is a weak pointer to ClassName
和这个声明
__weak ClassName * varName; //varName is a pointer to weak?? ClassName??
非常不同。但是,第二个的含义是明确的(虽然它在技术上是不正确的)并且它可以被编译器“原谅”。
一旦开始使用指针指针(例如Foo * __autoreleasing *
),正确性就更为重要。
我认为他们希望保护初学者开发人员不受C / C ++声明的影响。在开始时使用限定符似乎更自然。