Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么[NSDate]返回id?_Objective C_Nsdate - Fatal编程技术网

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类的组合所取代。