2012-10-29 45 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实例是否包含相同文本时)。