使用类型为id
的变量,可以发送任何已知消息,编译器不会抱怨.对于类型为NSObject *
的变量,只能向其发送NSObject声明的消息(不是任何子类的方法),否则它将生成警告.一般来说,id
是你想要的.
进一步说明:所有对象基本上都是id
型.声明静态类型的目的是告诉编译器,"假设这个对象是这个类的一个成员."因此,如果您向它发送一条类没有声明的消息,编译器可以告诉您,"等等,该对象不应该得到该消息!"此外,如果两个类有名称相同但签名不同的方法(即参数或返回类型),它可以通过为变量声明的类猜测您指的是哪个方法.如果它被声明为id
,编译器就会举手告诉你,"好吧,我这里没有足够的信息.我随机选取了一个方法签名."(不过,声明NSObject*
通常不会有帮助.通常冲突发生在两个更具体的类之间.)