Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在iPad 4上排序比较器排序错误_Ios_Objective C_Ipad_Methods - Fatal编程技术网

Ios 在iPad 4上排序比较器排序错误

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

我的公司有很多iPad 4s和iPad Air 2s,我们正在为这些设备部署一个定制应用程序。该应用程序在iPad Air 2s上运行良好,但iPad 4s有一个奇怪的bug。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);
}

知道怎么了吗?我不知道是什么原因导致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上运行测试时,这似乎不是问题。我唯一能想到的是,这可能只是数据集的侥幸,或者与内存分配方式有关。因为如果你先分配较小的数字,然后再分配较大的数字,这比你预期的要多。但是,这实际上取决于你是如何准确地测试这个方法的。这可以提供一些额外的见解。