Ios 为什么(self.window)在下面的代码中是一个条件?

Ios 为什么(self.window)在下面的代码中是一个条件?,ios,objective-c,Ios,Objective C,为什么(self.window)处于以下代码状态 -(void)beginRefreshing { [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.alpha = 1.0; }]; self.pullingPercent =

为什么
(self.window)
处于以下代码状态

-(void)beginRefreshing {
      [UIView animateWithDuration:MJRefreshFastAnimationDuration
                       animations:^{
                         self.alpha = 1.0;
                       }];
      self.pullingPercent = 1.0;
      if (self.window) {
        self.state = MJRefreshStateRefreshing;
      } else {
        self.state = MJRefreshStateWillRefresh;
        [self setNeedsDisplay];
      }
}

某些变量是布尔值,这意味着它们可以等于true或false。其他人可以有广泛的价值观。例如,如果一个整数等于5,你想做点什么,你可以写:

if (myInt == 5) { 
  //do something 
}
如果您的变量是布尔值,则只有两个选项,因此我们可以写得更短:

if (myBoolean) {
  //case where myBoolean = true
} else {
  //case where myBoolean = false
}
在您的特定示例中,
self.window
以以下方式计算为布尔值:self.windows是否存在于视图层次结构中(
self.windows==true
),或者它不存在(
self.windows==false

在这种情况下:

if (self.window) {
这是一个简短的版本

if (self.window != nil) {

测试视图(
UIView
实例)是否在任何窗口的视图层次结构中,也就是说,视图是否显示在屏幕上。

我决定将我的注释扩展为答案,以供将来参考


这实际上是一种副作用。因为false定义为
0
,而true定义为与
0
不同的任何内容。一个有效的对象地址是非零的,因此它被视为true,而由于ARC,
nil==0
。您可以通过打印此
NSLog(@“%p”,nil)
来检查这一点。请记住,对于整数,这意味着负值的计算结果也为真

还值得注意的是,由于
布尔值的底层存储很少是一位,因此
当someBool==true时,someBool==1
可能并不总是真的。这意味着走这样一条捷径:

- (NSInteger)increment:(NSInteger)toIncrement ifTrue:(BOOL)condition {
    return toIncrement + condition;
}
可能并不总是导致
toIncrement
增加
1
。代码有效,因为
BOOL
将自动升级为整数


这当然是边缘情况,但仍然有可能。

Context?这是什么类?从UIView继承的UITableView RefreshComponent检查的目的是查看视图是否在视图层次结构中,您可以通过阅读
UIView
window
属性的类引用来找到它。请注意
self.window
是指针,而不是布尔值。只是当在
if
语句的上下文中使用时,
if(self.window)
等同于
if(self.window!=nil)
no,我同意它的计算结果是布尔值。我主要是为OP澄清,虽然在这个特定的上下文中它的计算结果是布尔值,但变量本身不是布尔类型;这是一个指针。例如,您不能通过说
self.window=true来分配它,比较
if(self.window)
if(self.window!=nil)
,而不是
if(self.window==true)
这实际上是一个副作用,对吧。因为
false
被定义为
0
,而
true
被定义为与
0
不同的任何内容。有效地址是非零的,它被视为
true
,而由于ARC,
nil==0
。您可以通过打印此
NSLog(@“%p”,nil)
来检查这一点。请记住,对于整数,这意味着负值的计算结果也为
true
。通过将其
alpha
设置为
0
,或者将其
hidden
属性设置为
YES
@Losiowaty,视图实际上是不可见的。我知道这一点。对于这个答案,我决定忽略它。Objective-C中的
nil
值始终为零,但这与ARC无关。