变量限定符位置的“问题”是什么?

时间:2014-05-20 17:06:47

标签: objective-c syntax qualifiers

this document中,在标有“变量限定符”的部分下,Apple说:

  

您应该正确装饰变量。在对象变量声明中使用限定符时,正确的格式为:

ClassName * qualifier variableName;
  

例如:

MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;
  

其他变体在技术上是不正确的,但编译器“原谅”了。要了解此问题,请参阅http://cdecl.org/

查看cdecl.org并未澄清任何内容。任何人都可以解释他们所指的“问题”是什么?换句话说,帮助我说服其他人,这实际上不仅仅是因为“因为这个自述文件是这么说的。”

1 个答案:

答案 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 ++声明的影响。在开始时使用限定符似乎更自然。