Ios 在iPad 4上排序比较器排序错误
我的公司有很多iPad 4s和iPad Air 2s,我们正在为这些设备部署一个定制应用程序。该应用程序在iPad Air 2s上运行良好,但iPad 4s有一个奇怪的bug。sortUsingComparator方法对数组排序不正确 示例代码:Ios 在iPad 4上排序比较器排序错误,ios,objective-c,ipad,methods,Ios,Objective C,Ipad,Methods,我的公司有很多iPad 4s和iPad Air 2s,我们正在为这些设备部署一个定制应用程序。该应用程序在iPad Air 2s上运行良好,但iPad 4s有一个奇怪的bug。sortUsingComparator方法对数组排序不正确 示例代码: -(void)sortArraysOfStrings:(NSMutableArray*)stringArray andNumbers:(NSMutableArray*)numbersArray onCompletion:(void(^)(NSMutab
-(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);
}
知道怎么了吗?我不知道是什么原因导致iPad4无法正确运行该方法。这两种设备类型都运行iOS 10.2.1或10.3,并且该应用程序是在Xcode 8.3中构建的。上面代码中的问题是,您正在将
NSNumber
与
操作员进行比较。这将不起作用,因为您正在比较NSNumber
的指针值!如果您知道类型并选择使用类似于[nsNumberInstance integerValue]
的方法来提取它,则上述代码将起作用。或者您可以简单地选择使用NSNumber
的compare
方法。您是否在调试器中创建了一个断点,并确保numbersArray
不是nil?@SamB是的,numbersArray填充了与stringArrayFirst off相同数量的元素,您不应该使用
来比较NSNumber。您应该使用[num1比较:num2]
。此外,以下工作是否有效<代码>NSMutableArray*arr=[@[@5、@2、@5、@4]mutableCopy];NSArray*result=[arr SortedArrayingComparator:^NSComparisonResult(NSNumber*a,NSNumber*b){返回[a比较:b];}];NSLog(@“%@”,结果)@SamB-huh仔细检查后,ipad4没有跳过方法,只是排序/比较不正确,我仍然觉得奇怪,它只影响ipad4,而不影响iPad2。你是对的,比较法解决了我的问题。我编辑了我的问题以反映我的观察结果。把你的评论变成一个答案,我会接受的。只是出于好奇,你知道为什么这似乎只适用于老式设备吗?我将NSNumbers与iPad Air 2上的“>”操作员和模拟器进行比较时没有问题。比较指针的值应该会给出混淆的结果,但由于某种原因,在我在xcode/simulator/iPadAir2上运行测试时,这似乎不是问题。我唯一能想到的是,这可能只是数据集的侥幸,或者与内存分配方式有关。因为如果你先分配较小的数字,然后再分配较大的数字,这比你预期的要多。但是,这实际上取决于你是如何准确地测试这个方法的。这可以提供一些额外的见解。