2016-08-23 58 views
1

我知道最初一個NSNumber的正確的方法是NSNumber *a = @1;爲什麼的NSNumber * a = 0時不顯示錯誤

,當我宣佈NSNumber *a = 1;,我就得到了錯誤的int到

隱式轉換的NSNumber是不允許用圓弧

但我不知道爲什麼,當我宣佈NSNumber *a = 0;沒有錯誤

就我而言,我有寫的NSNumber類 一些功能,然後

  • 如果NSNumber的價值是@0,我可以使用的功能類別通常
  • 如果NSNumber的價值是0,我可以使用功能類別,沒有錯誤發生,但運行應用程序時,該功能將永遠不會調用
+3

的問題是,對象 - 是隻對C的層,因此它仍然包含所有從C的特徵例如在於'0'和'NULL'和falsy布爾都是一樣。以同樣的方式,你可以寫'if(20){'。 蘋果公司決定轉向現代編程語言(Swift)的許多原因之一,這一原因並未受到40年前語言設計決策的困擾。 – Sulthan

回答

11

0值是nilNULL,這是一個指針有效值的代名詞。

它與C的兼容性導致了這種不一致的行爲。

歷史

在C語言中,沒有特殊符號來表示未初始化的指針。相反,值0(零)被選擇來表示這樣一個指針。爲了使代碼更易於理解,引入了預處理器宏來表示該值:NULL。由於它是一個宏,C編譯器本身從不會看到該符號;它只看到一個0(零)。

這意味着0(零)是分配給指針的特殊值。即使它是一個整數,編譯器也會接受該賦值,而不會抱怨類型轉換,隱式或其他。

爲了與C保持兼容性,Objective-C允許將文字0賦值給任何指針。編譯器將其視爲與分配nil相同。

+0

那麼'0'的特殊情況對'1'不存在?我要問的原因是'nil'被定義爲'(id)0'和'NULL'作爲'(void *)0'(我上次看到的),所以這與'0'不一樣。所以有些奇怪的事情正在發生。 – Droppy

+0

是的。 0是一種特殊情況,因爲在C中,符號'NULL'是值爲0的預處理器定義。這意味着,對於編譯器來說,分配'NULL'實際上分配爲0.爲了與C保持兼容性,Objective-C即使在ARC下,也允許將一個文字零(但不包括運行時值爲零的變量)分配給任何指針。 – Avi

+0

Upvote for your nice answer – user3182143

3

0是一個空指針常量。一個空指針常量可以分配給任何指針變量並將其設置爲NULL或nil。至少在過去的45年中,C就是這種情況,在Objective-C中也是如此。與NSNumber * a = nil相同。

1

你可以考慮0nilnull可以分配給object1是整數,不能讓反對或非整數。

0

Objective-C靜默地忽略對象指針的方法調用,值爲0(即nil)。這就是爲什麼當您調用NSNumber類別指針的方法時,您會分配值0,因此沒有任何反應。

0

A nil如果您沒有使用其他值,則值是初始化對象指針最安全的方法,因爲在Objective-C中將消息發送到nil是完全可以接受的。如果你發送消息到零,顯然沒有任何反應。

注意:如果你希望從發送到零消息的返回值,返回值將是零的對象返回類型,0數字類型,並沒有找到BOOL類型。返回的結構將所有成員初始化爲零。

在過去Apple Doc Working with nil

相關問題