2014-10-31 66 views
1

我是初学者(编程时)学习Objective-C。 Xcode不会让我从NSDate对象分配返回值;我对此感到困惑。为什么我不能将timeIntervalSince1970返回值存储到指针?

NSDate *now = [NSDate date]; 
long seconds = [now timeIntervalSince1970]; 

如果我用一个指针来保存秒:

long *seconds = [now timeIntervalSince1970]; 

我看到的错误:

Initializing 'long *' with an expression of incompatible type 'NSTimeInterval' (aka 'double')

为什么我不能说“给我的now.timeIntervalSince1970返回值并坚持在这个地址“?

另一个问题是,为什么我不能初始化一个对象并在不需要指针的情况下使用它?这不起作用。

NSDate dateObject = [NSDate date]; 

我知道我的问题可能有一个非常简单的答案,但书中并没有解释任何的“为什么它以这种方式工作”的问题。

回答

4

这是因为[NSDate timeIntervalSince1970]返回值作为NSTimeInterval其为typedef d double,其是原始类型,而不是一个对象类型。

该值计算自1970年1月1日以来的秒数,并且不需要是对象。

可能其存储在一个指针,但是这将是愚蠢的:

NSTimeInterval *elapsed = (NSTimeInterval *)malloc(sizeof(NSTimeInterval)); 
*elapsed = [now timeIntervalSince1970]; 
... 
free(elapsed); 
+0

感谢。首先我听说过'原始'类型和'对象'类型。我会冒险猜测对象的接收消息,而原始类型不接受?所以我们使用指针来存储对象的地址? – 2014-10-31 11:41:44

+0

我想我很困惑,因为这本书是以C开头的。现在看来,Objective-C的规则正在发生变化,没有说明为什么。 – 2014-10-31 11:44:05

+0

@JumbalayaWanton这是一个很大的主题,你必须研究,但是所有的对象都是由基元构建的,而且这些对象必须动态分配(类似于我所展示的'malloc()'代码),并且对象接收消息。 – trojanfoe 2014-10-31 11:44:48

1

timeIntervalSince1970返回NSTimeInterval这是double一个类型定义。在苹果的文档,你会看到这样的定义如下

Objective-C的

typedef double NSTimeInterval; 

斯威夫特

typealias NSTimeInterval = Double 

和双是一种原始的,而不是一个对象类型,因此不应该成为一个指针(不应该在Apple documentation)。苹果文档还指出以下

NSTimeInterval is always specified in seconds; it yields sub-millisecond precision over a range of 10,000 years.

这里是Apple Documentation

+0

什么是downvote?请留下原因 – Popeye 2014-10-31 11:33:34

+0

“double是一个原语,而不是一个对象类型,所以不能成为一个指针”......你可以有一个指向原语类型的指针,这正是提问者在这种情况下要求怎么做的。 – nhgrif 2014-10-31 11:33:37

+0

@nhgrif好的,也许我应该改说一下,你不应该在苹果文档中的哪一个**是** https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction。 html#// apple_ref/doc/uid/TP40011210-CH1-SW1作为一个便笺,同时寻找文档,我确实在这里看到大量的答案**不能**有大量的upvotes。 – Popeye 2014-10-31 11:37:09

相关问题