例如:
@class X
interface Y: NSObject
{
X *x; //correct
X x; //incorrect
}
为什么这样?它如何知道在指针的情况下指向何处? 感谢
答案 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}}代码行:你将始终处理指针(某些级别)到实例/对象。