2012-10-29 80 views
0

我做了發件人類和發送對象:如何檢查函數的參數是否爲零?

Sender *sender = [[Sender alloc] init]; 

於是,我寫了測試:

// should success 
[sender upload:[UIImage imageNamed:@"test2.jpg"] withName:@"test2.jpg"]; 
// should fail 
[sender upload:nil withName:@"test2.jpg"]; 

於是,我寫了無校驗碼:

- (void)upload:(UIImage *)image withName:(NSString *)name 
{ 
    if ([image isEqual:nil]) { 
     ... 
    } 
    ... 
} 

但無檢查被忽略。 如何檢查圖像參數是否爲零? 謝謝你的好意。

回答

2

簡短的回答,與image == nil更換[image isEqual:nil]

朗的答案,當你寫:

[image isEqual:nil] 

你所要求的消息isEqual:被髮送到其引用存儲在變量image的對象。

但是,您不希望向對象發送消息,您希望確定變量image是否包含對對象的引用。要做到這一點,您需要比較您參考的與「無參考」值 - 寫入nil。在Objective-C(和C等)的值比較運算符是==所以你需要測試:

image == nil 

現在你可能會問,爲什麼你總有執行沒有錯誤的代碼,就不會產生預期的結果,鑑於沒有對象發送消息? Objective-C支持將消息發送到「無對象」,也就是nil,並返回結果類型的「零」值,即0,nil等。當轉換爲布爾值時,如在if語句中,「零」價值產生NO

HTH

1

@ yeesterbunny的回答是點爲你應該在這種情況下做什麼,但它也是很好的知道原因。

請記住,每個objc方法調用都是一條消息。當你打電話

[objA isEqual:objB] 

你發送一條消息給objA詢問它是否認爲自己「等於」objB。

如果您的方法的「圖像」參數爲零,則沒有任何內容可以發送消息。根據定義,任何消息都會返回nil。 (和「無」在if語句中與零相同。)

故事的道德:測試指針與==(或!=,或隱含在「if(!image)」中的相等性)如果您正在尋找零。使用isEqual:僅當您想要測試兩個對象(已知存在且類型相似)在語義上是否相等時(例如,當您想知道兩個NSString實例是否包含相同文本時)。