NSArray在if语句中表现出奇怪的行为

时间:2010-08-08 19:14:42

标签: objective-c

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

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 个答案:

答案 0 :(得分:2)

由于-objectAtIndex:返回id,编译器将无法知道-state应该返回什么。如果您没有导入首先声明state的标头,或者属性state具有不明确的声明(例如,另一个类在之前声明了@property(retain) id state ,那么您的课程是然后编译器可能会推断出-state的错误类型。

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

但是对于代码1,您已指定tempint,因此即使调用的返回值为0xFFFFFFFC,它也会被强制转换为有符号值(-4),因此条件失败。

最安全的方法是指定-objectAtIndex:的类型,即

Foo* obj = [[myArray objectAtIndex:iIndex] objectAtIndex:jIndex];
if (obj.state > 0) {
 ...

答案 1 :(得分:0)

我理解正确,并且两个if在同一个方法中 NOT ,然后第二个打印出一个未分配的变量。修复应该是这样的:

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