【问题标题】:sortUsingComparator sorting incorrectly on iPad 4在 iPad 4 上 sortUsingComparator 排序不正确
【发布时间】:2017-04-03 20:18:13
【问题描述】:

我的公司有许多 iPad 4s 和 iPad Air 2s,我们正在为这些设备部署一个自定义应用程序。该应用程序在 iPad Air 2s 上运行良好,但 iPad 4s 有一个奇怪的错误。 sortUsingComparator 方法对我的数组进行了错误的排序。

示例代码:

-(void)sortArraysOfStrings:(NSMutableArray*)stringArray andNumbers:(NSMutableArray*)numbersArray onCompletion:(void(^)(NSMutableArray*,NSMutableArray*))callback {

//sort here
[stringArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

[numbersArray sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    NSNumber *num1 = (NSNumber*)obj1;
    NSNumber *num2 = (NSNumber*)obj2;
    if (num1 > num2) {
        return (NSComparisonResult)NSOrderedDescending;
    }else {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

//return arrays in completion handler
callback(nameArray, targetArray);
}

知道有什么问题吗?我不知道是什么导致 iPad 4 错误地运行该方法。两种设备类型都运行 iOS 10.2.1 或 10.3,并且该应用是在 Xcode 8.3 中构建的

【问题讨论】:

  • 您是否在调试器中创建了断点并确保numbersArray 不为零?
  • @SamB 是的,numbersArray 填充了与 stringArray 相同数量的元素
  • 首先,您不应该使用> 来比较 NSNumber。你应该使用[num1 compare:num2]。另外,以下是否有效? NSMutableArray *arr = [@[@5, @2, @5, @4] mutableCopy]; NSArray *result = [arr sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) { return [a compare:b]; }]; NSLog(@"%@", result);
  • @SamB huh 仔细检查后 ipad4 并没有跳过该方法,它们只是错误地排序/进行比较,我仍然觉得奇怪的是它只影响 ipad4 而不是 ipad air2 .你是对的,比较方法解决了我的问题。我编辑了我的问题以反映我的观察。把你的评论变成我会接受的答案。

标签: ios objective-c ipad methods


【解决方案1】:

上面代码中的问题是您将NSNumber> 运算符进行比较。这将不起作用,因为您正在比较 NSNumber 的指针的值!如果您知道类型并选择使用[nsNumberInstance integerValue] 之类的方式提取它,则上述代码将起作用。或者你可以简单地选择使用NSNumbercompare方法。

【讨论】:

  • 只是出于好奇,您知道为什么这似乎特定于旧设备吗?我将 NSNumbers 与 iPad Air 2 上的“>”运算符和模拟器进行比较没有问题。比较指针的值应该会产生混淆的结果,但由于某种原因,当我在 xcode/simulator/iPadAir2 上运行测试时,这似乎不是问题。
  • 我唯一能想到的可能只是数据集的侥幸,或者它与内存的分配方式有关。因为如果您先分配较小的数字,然后再分配较大的数字,那么您会期望它被订购。但是,这实际上取决于您如何准确地测试此方法。这可以提供一些额外的见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多