Try running this:
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);
Output I get is:
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
Why doesn't Obj-C short circuit for !testView
(in Take 1)?
Why does it go into !testView
when testView is clearly nil in Take 3?
Should I not be testing the function of a nil object (e.g. when I test for subviews
)?