代码之家  ›  专栏  ›  技术社区  ›  usrgnxc

国际单项体育联合会声明中的奇怪行为

  •  2
  • usrgnxc  · 技术社区  · 16 年前

    我有以下两段代码,我认为应该是相同的

    int temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state];
    if (temp > 0)
    {
        NSLog(@"TEST: %d",temp);
    }
    
    if ([[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state] > 0)
    {
        NSLog(@"TEST: %d",temp);
    }
    

    state只是数组中对象中的一个int,具有如下访问器:

    @property (assign)int state;
    

    但是当状态为负时,第一个版本可以工作(没有输出),而第二个版本输出(例如)“test:-4”(?!)

    是否有明显的原因说明它们可能不同?

    2 回复  |  直到 16 年前
        1
  •  2
  •   kennytm    16 年前

    自从 -objectAtIndex: 返回一个 id ,编译器将无法知道 -state 应该返回。如果没有导入声明 state 首先,或者如果财产 状态 具有不明确的声明(例如,另一个类已声明 @property(retain) id state 之前 您的类已导入),则编译器可能会为 状态 .

    如果它推断 身份证件 例如,由于所有指针都是非负的, -4 将被隐式地视为 0xFFFFFFFC ,因此>0条件通过。

    但是对于代码1,您已经指定了 temp 是一个 int ,因此即使调用的返回值是 0xFFFFFFC ,它将被转换回有符号值( - 4 ,因此条件失败。

    最安全的方法是指定 -对象索引: ,即

    Foo* obj = [[myArray objectAtIndex:iIndex] objectAtIndex:jIndex];
    if (obj.state > 0) {
     ...
    
        2
  •  0
  •   Max Seelemann    16 年前

    我理解得很对,如果两个是 不是 在同样的方法中,第二个方法会打印一个未分配的变量。修复应该如下所示:

    if ((temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state]) > 0)
    {
        NSLog(@"TEST: %d",temp);
    }