2014-10-31 102 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

相關問題