为什么不返回NSDate*
?
它应该是一个创作功能吗?所有创建函数都返回类型为创建它的类的类。
现在,我不能NSDate.date.timeIntervalSince1970
:(
我认为编译器很聪明,知道NSDate.date返回NSDate,即使返回类型是id?
答案 0 :(得分:11)
从iOS 7开始,Apple正在使用instancetype
作为大多数Foundation框架API(以及其他框架)的返回类型,所以现在+date
已NSDate
以下签名:
+ (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。