为什么[NSDate日期]返回id?

Sha*_*yrs 10 objective-c nsdate

为什么不回来NSDate*

它应该是一个创造功能吗?所有创建函数都返回类型为创建它的类的类.

现在,我做不到NSDate.date.timeIntervalSince1970:(

我认为编译器足够聪明,知道NSDate.date返回NSDate,即使返回类型是id?

Gab*_*lla 11

UPDATE

从iOS的7起,苹果采用instancetype的返回类型最基础框架的API(和其他框架也是如此),所以现在的实例+dateNSDate具有以下特征:

+ (instancetype)date
Run Code Online (Sandbox Code Playgroud)

我刚写了一篇关于它的短文.

原始答案

返回构造函数和工厂方法id,以允许子类在不使用ovverriding的情况下使用它们.

想象一下,你有一个NSDate被调用的子类NSMutableDate.

如果你打电话

[NSMutableDate date]
Run Code Online (Sandbox Code Playgroud)

现在你希望有一个NSMutableDate *对象返回,但如果date返回,NSDate *你需要覆盖改变返回类型的方法.

使用id允许这种灵活性.

实际上instancetype,如果你定义自己的工厂方法,clang编译器有一个派上用场的关键字.我最近在这里讨论了这个具体问题.


Mon*_*olo 5

类工厂的方法(如[NSMutableDate date],[NSMutableArray array]等)内部使用alloc/ init,并返回的任何init返回.

init并且它的兄弟姐妹(initWith...)总是返回一个id,并且通过扩展,类工厂方法也是如此.