2

在转换(没有双关语)以澄清何时在变量声明中使用时,我在Transitioning to ARC Release Notes__strong中遇到了这些行:

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

  ClassName * qualifier variableName;

例如:

  MyClass * __weak myWeakReference;    
  MyClass * __unsafe_unretained myUnsafeReference;

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

我怀疑这是苹果公司的某种玩笑,但我想我不明白。这显然没关系,但我想把它做好。正确“装饰”变量声明的重要性是什么,cdecl.org 试图说明什么?

编辑:澄清一下,我想准确理解为什么写作

qualifier ClassName * variableName;

是“技术上不正确的”。

4

1 回答 1

2

所以我想我有一个答案,但我不能确定我是否正确。随意提供一个更好的,或者如果你认为我已经完成了评论/赞成。

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”指针的指针是没有意义的。

于 2012-06-03T13:42:21.957 回答