objective-c - 当 Apple 文档提到包含 ARC 属性的正确位置时,它是什么意思?

标签 objective-c c automatic-ref-counting declaration cdecl

当进行转换(没有双关语意图)以澄清何时在变量声明中使用 __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/

相关文章:

c++ - 从 C 程序使用 Qt 库

iphone - 返回强制转换为ARC下CFStringRef的NSString * -如何摆脱分析器警告?

ios - 在表格 View 自定义单元格中的图像上长按手势

objective-c - iOS 8 自定义后退按钮

ios - 如何以毫秒为单位准确记录方法的执行时间?

ios - 使用实例变量/属性/与 ARC 合成的正确方法

ios - ARC 和 Objective C 子类化

c# - 在 C# 和 Objective-C 之间维护通用代码的好方法是什么?

C - 使用按位运算符确定是否所有偶数位都设置为 1

C:打开的文件太多