【发布时间】:2015-02-15 11:12:17
【问题描述】:
尝试运行这个:
UIView *testView = nil;
NSLog(@"Take 1");
NSString *message = @"view doesn't exist";
if (!testView && !testView.subviews) {
message = @"this message should never appear" ;
}
NSLog(message);
NSLog(@"Take 2");
message = @"view doesn't exist";
if (testView != nil && testView.subviews != nil) {
message = @"this message should never appear" ;
}
NSLog(message);
NSLog(@"Take 3");
message = @"view doesn't exist";
if (!testView) {
if (!testView.subviews) {
message = @"this message should never appear" ;
}
}
NSLog(message);
NSLog(@"Take 4");
message = @"view doesn't exist";
if (testView != nil) {
if (testView.subviews != nil) {
message = @"this message should never appear" ;
}
}
NSLog(message);
我得到的输出是:
Take 1
this message should never appear
Take 2
view doesn't exist
Take 3
this message should never appear
Take 4
view doesn't exist
为什么 Obj-C 不短路 !testView(在 Take 1 中)?
为什么在 Take 3 中 testView 明显为零时,它会进入!testView?
我不应该测试 nil 对象的功能吗(例如,当我测试 subviews 时)?
【问题讨论】:
-
你自己搞糊涂了。因为
testView是nil,所以!testView是真的。!testView.subviews也是如此。除此之外,Take 3 和 Take 4 的逻辑显然是相反的,所以你应该期待相反的结果。瞧,你得到了相反的结果。 -
感谢@KenThomases,我已经删除了罪魁祸首。
标签: objective-c short-circuiting evaluate