当围绕(没有双关语)澄清何时在变量声明中使用__strong
时,我在Transitioning to ARC Release Notes中遇到了这些行:
您应该正确装饰变量。在对象变量声明中使用限定符时,正确的格式为:
ClassName * qualifier variableName;
例如:
MyClass * __weak myWeakReference; MyClass * __unsafe_unretained myUnsafeReference;
其他变体在技术上是不正确的,但编译器“原谅”了。要了解此问题,请参阅http://cdecl.org/。
我怀疑这是苹果公司的一些玩笑,但我不认为我明白这一点。这显然没关系,但我想做得对。正确“装饰”变量声明的重要性是什么,cdecl.org试图制作什么点?
编辑:澄清一下,我想了解为什么写作
qualifier ClassName * variableName;
“技术上不正确。”
答案 0 :(得分:2)
所以我觉得我有答案,但我不能确定我是否正确。如果你认为我已经钉了它,请随意提供一个更好的,或评论/ upvote。
CDecl是一个C程序,您可以从同一个网站下载。它的存在是为了解决this question中的问题。
C中的变量声明可能非常臭名昭着,尤其是考虑到typedef时。这个over at 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的常量指针。彻底讨论了细微的差异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;
但同样适用。除了对象指针之外,只有这些关键字。因此,声明指向“强”的指针是没有意义的。