令人费解:如果声明< =不能按预期工作

时间:2011-07-06 19:34:36

标签: iphone objective-c debugging

这可能是显而易见的,但我看不到它......

NSLog(@"nthObject = %i, [mutableFetchResults count] - 1 = %i", nthObject, [mutableFetchResults count] - 1);
if (nthObject <= [mutableFetchResults count] - 1) {
    MyObject *myObject = [mutableFetchResults objectAtIndex:nthObject];

mutableFetchResults的计数为零,因此[mutableFetchResults count] - 1 = -1且nthObject为0.这由Log记录。

nthObject是传递给方法的int。

所以of语句应该说if(0&lt; = -1)因此不会触发MyObject * myObject = [mutableFetchResults objectAtIndex:nthObject]行,但是当它尝试访问时它会导致崩溃空数组。

有什么想法吗?

非常感谢,

克里斯。

4 个答案:

答案 0 :(得分:8)

我假设mutableFetchResultsNSMutableArrayNSArray的子类)。 count成员NSUInteger是未签名的,因此[mutableFetchResults count] - 1不会为负数 - 它会变成一个非常大的数字。

将您的测试更改为:

if (nthObject < [mutableFetchResults count])

答案 1 :(得分:2)

[mutableFetchResults count]是无符号整数吗?格式字符串中的“%i”表示将其打印为带符号的int,但这并不意味着它是......

答案 2 :(得分:1)

[mutableFetchResults count]返回NSUInteger。

如果count为0,则NSUInteger上的0 - 1将不为-1,它将“包裹”并且是一个大数字。

答案 3 :(得分:1)

[mutableFetchResults count]可能是this,因此它产生无符号整数。它将回绕到无符号整数的最大值,您的i也将被提升为无符号类型。

你的比较最终会像(0&lt; 0xffffffff)。