Objective c 为什么[NSDate]返回id?
为什么它不返回Objective c 为什么[NSDate]返回id?,objective-c,nsdate,Objective C,Nsdate,为什么它不返回NSDate* 这应该是一个创造功能,对吗?所有创建函数返回类型为创建它的类的类 现在,我不能执行NSDate.date.timeIntervalSince1970:( 我认为编译器足够聪明,可以知道NSDate.date返回NSDate,即使返回类型是id?这是一种工厂方法,提供了创建新的自动发布对象的方便方法 见此。类工厂方法(如[NSMutableDate],[NSMutableArray]等)在内部使用alloc/init,并返回init返回的任何内容 init及其同级(i
NSDate*
这应该是一个创造功能,对吗?所有创建函数返回类型为创建它的类的类
现在,我不能执行NSDate.date.timeIntervalSince1970
:(
我认为编译器足够聪明,可以知道NSDate.date返回NSDate,即使返回类型是id?这是一种工厂方法,提供了创建新的自动发布对象的方便方法 见此。类工厂方法(如
[NSMutableDate]
,[NSMutableArray]
等)在内部使用alloc
/init
,并返回init
返回的任何内容
init
及其同级(initWith…
)总是返回一个id
,并且通过扩展,类工厂方法也是如此。更新
从iOS 7开始,对于大多数基础框架API(以及其他框架),Apple使用了<代码> StaseCype y/Cuff>作为返回类型,因此,例如<代码> +日期>代码> <代码> NSDATE < /代码>具有以下签名:
+ (instancetype)date
我只是写了一篇关于它的文章
原始答案
构造函数和工厂方法返回id
,以便允许子类使用它们,而无需OVOVOVERRIDING
假设您有一个子类NSDate
,名为NSMutableDate
如果你打电话
[NSMutableDate date]
现在,您希望返回一个NSMutableDate*
对象,但是如果date
返回NSDate*
,您就需要重写该方法来更改返回类型
使用id
允许这种灵活性
实际上,clang编译器有instancetype
关键字,在您定义自己的工厂方法时,该关键字非常有用。
我最近谈到了这个特定的问题。因为它短了6个字符。(Xcode标记?为什么?这与Xcode有什么关系?@SharenEayrs您无论如何都不应该对非属性使用点语法:)这是一个不好的、令人沮丧的做法,因为它令人困惑。点符号只能用于C结构和属性。@JakobEgger:那么,您可能对Clang感兴趣。当然,您必须等待Apple将其添加到Cocoa中,但您可以在自己的类中使用它。对于任何想知道的人来说,NSDate最初有一个可变子类使用了此方法—NSCalendarDate。此后,它被单独的NSCalendar和NSDate类的组合所取代。