0

我制作了 Sender 类和 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"];

然后,我写了 nil 检查代码:

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

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

4

3 回答 3

3

尝试

if(!image)

或者

if(image == nil)
于 2012-10-29T01:32:08.177 回答
2

简短的回答,替换[image isEqual:nil]image == nil.

长答案,当你写:

[image isEqual:nil]

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

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

image == nil

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

高温高压

于 2012-10-29T02:08:19.567 回答
1

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

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

[objA isEqual:objB]

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

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

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

于 2012-10-29T03:08:32.067 回答