为什么我们可以创建一个前向声明的类的指针变量而不是该类的对象?

时间:2015-12-13 06:15:15

标签: objective-c forward-declaration

例如:

@class X 
interface Y: NSObject
{ 
X *x;  //correct
X x;    //incorrect
}

为什么这样?它如何知道在指针的情况下指向何处? 感谢

2 个答案:

答案 0 :(得分:2)

混乱的根源似乎是你的问题:

  

它如何知道在指针的情况下指向何处?

问自己什么时候宣布:

int x;

它如何知道给x提供什么价值?您已使用某个类型x的名称int声明了变量,并且变量是的容器。有什么价值?

根据变量的语言和种类(全局,本地,实例等),两个常见答案是(a)未定义 - 您不能依赖的任意内容和(b)类型的零 - {{ 1}}用于上述0。答案是(c)某个特定值,例如int

现在让我们看一下你问题中的声明:

42

您有一个名称为X *x; 的变量,其类型为x,问题是此变量中将放置什么值。现代(ARC)Objective-C选择(a)或(b)X *,其中X *是类类型?它选择(b),X的零是X *。如上所述,答案是(c),指向nil的某个特定实例的指针。

换句话说,问题的答案

  

它如何知道在指针的情况下指向何处?

它是否指向任何地方,使用零指针值,即X

转到你问题引起的第二个问题,你也宣布:

nil

其中X x; 是类类型,请注意它是不正确的。在Objective-C中,所有类的实例都必须通过指针引用,没有"值类" - 如果你需要那些你使用结构(X)。

HTH

答案 1 :(得分:1)

指针只是一个指针。无论指向什么,它都有固定的大小。因此,它的类型仅用作额外信息(作为演员类型)。如果你搞砸了,这将在运行时出现。

另一方面:编译器需要精确的类足迹来创建该类的实例。

编辑:正如rmaddy在评论中指出的那样,在任何情况下,Objective-C都不支持你的{{1}}代码行:你将始终处理指针(某些级别)到实例/对象。