为什么[NSDate distantPast]和[NSDate distantFuture]方法返回id?

时间:2013-02-08 17:48:16

标签: objective-c cocoa nsdate return-type

我想知道为什么[NSDate distantPast][NSDate distantFuture]方法的返回类型属于id类型?为什么这些方法不返回NSDate指针?

4 个答案:

答案 0 :(得分:5)

因为多态性在某种程度上是有效的。

假设你是子类NSDate并且想要覆盖该方法。您必须使用相同的签名,这样您才能使用此签名:

-(NSDate*) distantPast;

但是您无法将表达式的结果分配给子类类型的指针,并且您需要向下转换结果:

NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast];
// Downcasting is necessary here, it would give a warning or syntax error otherwise.

即使您确定返回的对象是NSDate的子类,也需要向下转换结果。这就是为什么返回创建的对象的所有方法都被声明为返回id。

答案 1 :(得分:3)

NSDate是一个抽象超类,distantPastdistantFuture返回NSDate的私有子类,而不是NSDate本身。

答案 2 :(得分:1)

我认为这个问题也就像问你应该在init方法上返回什么一样?我们班级的id或指针。

因为在这种情况下它会是相同的,你可以认为它是Apple对类方法的某种标准化。

答案 3 :(得分:1)

这没有特别的原因。另一张海报指出这些方法可能会返回NSDate的私有子类,但NSDate的子类仍然是NSDate。我猜这些方法足够老(即在Mac OS之前的NextStep),id返回类型的原因是历史的,并且“丢失到古代”。 (如果您在Mac OS文档中查看这些方法,它表示它们是在Mac OS 10.0中定义的)

我敢打赌,旧学校的方法是到处使用匿名对象指针。