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

时间:2013-01-03 09:41:47

标签: objective-c nsdate

为什么不返回NSDate*

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

现在,我不能NSDate.date.timeIntervalSince1970 :(

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

3 个答案:

答案 0 :(得分:11)

更新

从iOS 7开始,Apple正在使用instancetype作为大多数Foundation框架API(以及其他框架)的返回类型,所以现在+dateNSDate以下签名:

+ (instancetype)date

我刚刚写了一篇关于它的short article

原始答案

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

想象一下,你有NSDate的子类叫NSMutableDate

如果你打电话

[NSMutableDate date]

现在你希望有一个NSMutableDate *对象,但如果date返回NSDate *,则需要覆盖该方法来更改返回类型。

使用id可以实现这种灵活性。

实际上,如果您定义自己的工厂方法,则clang编译器会使用instancetype关键字。 我最近谈到了这个具体问题here

答案 1 :(得分:5)

类工厂方法(例如[NSMutableDate date][NSMutableArray array]等)在内部使用alloc / init,并返回init返回的任何内容。< / p>

init及其兄弟(initWith...)始终返回id,并且通过扩展,类工厂方法也是如此。

答案 2 :(得分:3)

这是一种工厂方法,提供了一种创建新的自动释放对象的便捷方法。

请参阅此Apple guide