8

为什么不返回NSDate*

应该是创造功能吧?所有创建函数都返回类型为创建它的类的类。

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

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

4

3 回答 3

11

更新

从 iOS 7 开始,Apple 将instancetype大多数 Foundation 框架 API(以及其他框架)用作返回类型,因此现在例如+dateofNSDate具有以下签名:

+ (instancetype)date

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

原始答案

构造函数和工厂方法返回id是为了允许子类在不覆盖的情况下使用它们。

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

如果你打电话

[NSMutableDate date]

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

使用id允许这种灵活性。

实际上,当您定义自己的工厂方法时,clang 编译器具有instancetype派上用场的关键字。我最近在这里谈到了这个具体问题。

于 2013-01-03T10:01:33.430 回答
5

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

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

于 2013-01-03T09:57:01.067 回答
3

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

请参阅此Apple 指南

于 2013-01-03T09:44:12.613 回答