我有以下两段代码,我认为应该是相同的
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”(?!)
有什么明显的原因可能会有所不同吗?
答案 0 :(得分:2)
由于-objectAtIndex:
返回id
,编译器将无法知道-state
应该返回什么。如果您没有导入首先声明state
的标头,或者属性state
具有不明确的声明(例如,另一个类在之前声明了@property(retain) id state
,那么您的课程是然后编译器可能会推断出-state
的错误类型。
例如,如果它推断id
,因为所有指针都是非负的,-4
将被隐式地视为0xFFFFFFFC
,因此> 0条件通过。
但是对于代码1,您已指定temp
是int
,因此即使调用的返回值为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);
}