所以我想我有一个答案,但我不能确定我是否正确。随意提供一个更好的,或者如果你认为我已经完成了评论/赞成。
CDecl 是一个 C 程序,您可以从同一网站下载。它的存在是为了解决诸如this question之类的问题。
C 中的变量声明可能非常臭名昭著,尤其是在考虑到 typedef 时。在 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 的常量指针。在这个问题中彻底讨论了细微的差异。(本质上,在第一个示例中,您可以使 foo 指向另一个常量 int,但不能通过 foo 修改常量 int;在第二个示例中,您可以修改 foo 指向的 int,但您不能使 foo 指向任何内存中的其他位置)。
有了这些 ARC 属性,使用的语法
__strong NSString * myString
将 myView 声明为指向“强”UIView 的指针。这是荒谬的。在 ARC 下,只有指向对象的指针才能具有强(或弱或其他)的属性。所以写是个好习惯
NSString * __strong myString
因为这与其他 C 关键字一致。
我确实问过自己:如果你声明一个强对象指针指向一个弱对象指针,比如一个 NSString,在 ARC 下会发生什么,就像这样
NSString * __weak * __strong myContrivedPointer;
但同样适用。只有一个对象指针才能有这些关键字。因此,声明指向“strong”指针的指针是没有意义的。