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

asl*_*nci 1 cocoa objective-c return-type nsdate

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

Ram*_*uri 5

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

假设你是子类NSDate并且想要覆盖该方法.您必须使用相同的签名,以便使用此签名执行此操作:

-(NSDate*) distantPast;
Run Code Online (Sandbox Code Playgroud)

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

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

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