如何检查功能参数是否为零?

时间:2012-10-29 01:27:57

标签: objective-c

我发了Sender类和发送者对象:

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]) {
        ...
    }
    ...
}

但是忽略了零检查。 如何检查图像参数是否为零? 谢谢你的好意。

3 个答案:

答案 0 :(得分:3)

尝试

if(!image)

if(image == nil)

答案 1 :(得分:2)

简短回答,将[image isEqual:nil]替换为image == nil

答案很长,当你写:

[image isEqual:nil]

您要求将消息isEqual:发送到其参考存储在变量image中的对象。

但是,您不希望向对象发送消息,您希望确定变量image是否包含对对象的引用。为此,您需要将引用的与“无引用”值进行比较 - 该值为nil。 Objective-C(和C等人)中的值比较运算符为==,因此您需要测试:

image == nil

现在你可能会问为什么你的代码没有错误地执行,只是没有产生你期望的结果,因为没有对象发送消息? Objective-C支持向“无对象”发送消息,即nil,并返回结果类型的“零”值,即0nil等。转换为布尔值时值,如在if语句中,“零”值会产生NO

HTH

答案 2 :(得分:1)

@ yeesterbunny的回答是关于在这种情况下你应该做些什么,但知道原因也很好。

请记住,每个objc方法调用都是一条消息。当你打电话

[objA isEqual:objB]

你正在向objA发送一条消息,询问它是否认为自己与objB“相等”。

如果您的方法的“image”参数为nil,则没有任何内容可以向其发送消息。根据定义,任何到nil的消息都返回nil。 (在if语句中,“nil”与零相同。)

故事的道德:如果你正在寻找零,测试指针与==(或!=,或隐含地如“if(!image)”)相等。使用isEqual:仅当您要测试两个对象(已知存在且类似类型)在语义上是否相等时(例如,当您想知道两个NSString实例是否包含相同的文本时)。