当进行转换(没有双关语意图)以澄清何时在变量声明中使用 __strong
时,我在 Transitioning to ARC Release Notes 中遇到了这些行:
You should decorate variables correctly. When using qualifiers in an object variable declaration, the correct format is:
ClassName * qualifier variableName;
for example:
MyClass * __weak myWeakReference; MyClass * __unsafe_unretained myUnsafeReference;
Other variants are technically incorrect but are “forgiven” by the compiler. To understand the issue, see http://cdecl.org/.
我怀疑这是苹果公司的某种内部玩笑,但我不认为我明白。这显然并不重要,但我想把它做好。正确“装饰”变量声明的重要性是什么?cdecl.org 试图表达什么观点?
编辑:澄清一下,我想准确理解为什么写作
qualifier ClassName * variableName;
“技术上不正确。”
最佳答案
所以我想我已经有了答案,但我不能确定我是否正确。请随意提供更好的,或者如果您认为我已经做到了,请发表评论/点赞。
CDecl 是一个 C 程序,您可以从同一网站下载它。它的存在是为了解决诸如 this question 中的问题。 .
C 中的变量声明可能非常臭名昭著,尤其是考虑到 typedef 时。这个有很好的介绍over at Unixwiz.net 。您会发现其中有一个有用的介绍,甚至可以让您阅读诸如 char *(*(**foo [][8])())[];
(foo是 8 个指向函数的指针的数组的数组,返回指向 char 的指针数组的指针
)。
这些的规则是有效的接近。考虑一个简单的例子
const int * foo
这将 foo 声明为指向常量 int 的指针。然而,
int * const foo
将把 foo 声明为指向 int 的常量指针。彻底讨论了微妙的差异in this question. (本质上,在第一个示例中,您可以使 foo 指向另一个常量 int,但不能通过 foo 修改常量 int;在第二个示例中,您可以修改 foo 指向的 int,但不能使 foo 指向任何内存中的其他位置)。
有了这些ARC属性,使用的语法
__strong NSString * myString
会将 myView 声明为指向“强”UIView 的指针。这是无稽之谈。在 ARC 下,只有指向对象的指针才能具有强(或弱或其他)属性。因此,编写是一个很好的做法
NSString * __strong myString
因为这与其他 C 关键字一致。
我确实问过自己:如果你声明一个强对象指针指向一个弱对象指针,比如说一个 NSString,在 ARC 下会发生什么
NSString * __weak * __strong myContrivedPointer;
但这同样适用。除了对象指针之外,没有任何东西可以具有这些关键字。因此,声明一个指向“强”指针的指针是没有意义的。
关于objective-c - 当 Apple 文档提到包含 ARC 属性的正确位置时,它是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870524/