【问题标题】:Why doing minus operation for NSUInteger while comparing crashed?为什么在比较崩溃时对 NSUInteger 进行减法运算?
【发布时间】:2020-08-09 07:41:28
【问题描述】:

我正在比较两个NSUInteger,我一直在崩溃,这就是-[__NSCFNumber length]: unrecognized selector sent to instance

NSUInteger index = [masterArray indexOfObject:object];
if (index != NSNotFound){
    if (index < [anArray  count] - 1 ){
        //Do something
    }
    else{
        //Do something
    }
}

阅读old post 的类似问题,但我仍然无法弄清楚。我试过投射,但它仍然崩溃:

NSUInteger index = [masterArray indexOfObject:object];
if (index != NSNotFound){
    if (index < (NSUInteger)((int)[anArray  count] - 1) ){
        //Do something
    }
    else{
        //Do something
    }
}

但是,没有任何减号操作,它可以工作。

NSUInteger index = [masterArray indexOfObject:object];
if (index != NSNotFound){
    if (index < [anArray  count]){
        //Do something
    }
    else{
        //Do something
    }
}

知道为什么吗?提前致谢。

【问题讨论】:

  • -[__NSCFNumber length] 是在此代码中还是在 //Do something 中崩溃? anArray[count - 1] 的结果类是 NSNumber 而你期待的是 NSString 吗?
  • 我认为崩溃发生在“//做某事”部分。如果'index
  • 你们说得对,根据意见重新检查我的代码后,我发现anArray在某些情况下是一个空数组,导致后续代码崩溃。谢谢!我将关闭这篇文章,因为它不再与问题相关。

标签: objective-c


【解决方案1】:

数组不是问题。 看看下面的例子会发生什么。

NSUInteger i = 0;
NSLog(@"%@", i-1==NSUIntegerMax ? @"YES" : @"NO" );
//output: YES

NSLog(@"NSUIntegerMax=%lu", NSUIntegerMax );
//output: NSUIntegerMax=18446744073709551615

NSLog(@"%lu", i-1 );
//output: 18446744073709551615

因此,当数组计数为 0 并减去 1 时,您最终会得到 NSUIntegerMax

您将array.count - 1 与一系列不能表示有符号(负)数的数字进行比较。

array.countNSUInteger 类型的属性。
所以在下面的场景中会出现

当array.count == 0时,

array.count - 1 == 18446744073709551615 // not!! -1

除非您真的想与 NSUIntegerMax 进行比较,否则您的 if 语句将无法按预期工作。 正如您发现的那样,转换为整数可能会对您有所帮助..
你会想要

if (index < ((int)array.count) - 1) {
} else {
}

因为当 array.count (NSUInteger)((int)array.count - 1)
仍然是 18446744073709551615 == NSUIntegerMax

您也可以不使用此解决方案进行强制转换

if (index + 1 >= array.count) {
} else {
}

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2014-03-17
    • 2019-02-20
    • 1970-01-01
    • 2011-12-08
    • 2011-08-14
    相关资源
    最近更新 更多