2011-08-26 57 views
2

一個看似簡單的問題`優點:我可以有某種數量的對象,可以是零,但是我可以指定像原始INT:如何結合int`和`NSInteger`

這樣:

NSNumber *n = nil; 
n = 3; 

if(n == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
} 

感謝您的輸入

+5

NSInteger的是不一樣的NSNumber。 NSNumber是一個類,而NSInteger是一個typedef。 – vikingosegundo

+0

爲什麼你使用NSInteger或int? – mayuur

+0

確實,使用基本int可能是最簡單的解決方案,但我喜歡這樣一個事實,即一個對象可以是「空」,因此零,這顯然不可能與一個int。 – Besi

回答

6

答案是NO。如果變量是一個對象您可以分配另一目的,

n = anotherNSNumber; 

,或者通過使用性質或通過方法

n = [NSNumber numberWithInt:3]; 

設置的值,並且比較與另一對象對象,

if (n == anotherNSNumber) // Checks the reference 

或通過使用比較其性能/方法

if (([n intValue] == 3) || ([n intValue] == [anotherNSNumber intValue])) 
1

不,你不能。原因是nil是指向地址0x0的指針,即nil == 0。因此,您將無法在0nil之間消除歧義。

更何況他們也應該是不同類型的事實。 nil用作指針,而像0或3這樣的數字是標量。

nil被定義爲

#define nil NULL 

NULL一個典型的定義是這樣的:

#define NULL ((void *)0) 
1

沒有辦法的辦法,你認爲你可以。第

當你說:

NSNumber *n = nil; 

你說的是聲明指向一個NSNumber對象的指針,但是現在有它指向零這是正常的;因爲你以後可能會做的是獲取一個指向NSNumber對象的指針,然後將其分配給這個變量,這樣n就是一個指針,它不是有效的NSNumber對象。

隨着你的下一行:

n = 3; 

你是不是值分配給對象,但你說n指向地址3.這是不是一個地址,不包含一個東西。

3

其他人提到的簡短答案是「否」。
但接下來的輕微修改您的代碼將實現類似的結果:

NSNumber *nObject = [NSNumber numberWithInt:3]; 
int n = nObject.intValue; // Zero if nObject is nil 

if(nObject == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
} 
+0

如果nObject爲零,你確定n是0嗎?我寧願猜測它仍然未初始化,並可能有任何價值。 –

+0

當nObject爲零時,n的值確實爲零。這是因爲發送給nil對象的消息總是返回nil,nil是地址零。 'NSNumber * nObject = nil; int n = nObject.intValue; NSLog(@「n的值爲%d」,n);'將輸出「n的值爲0」 – aLevelOfIndirection