在objective-c中反转数组中的元素

Cry*_*tal 0 iphone objective-c nsarray

NSUInteger是否缺少一些东西.我本来想在我的.m文件中这样做.(我看到一些关于使用NSEnumerator的代码,但我不太了解它,所以我想我的需求,这就足够了).

所以我想这样做:

- (NSArray *)reverseArray:(NSMutableArray *)array {
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
    for (NSUInteger i = [array count] - 1; i >= 0 ; i--) {
        [anArray addObject:[array objectAtIndex:i]];
    }
    return anArray;
}
Run Code Online (Sandbox Code Playgroud)

这给了我编译器警告:i> = 0是NSUInteger的目的,或者是那些行.当我运行该程序时,它也会崩溃并访问一些超级巨大的数字.我不太清楚为什么.我可以在任何地方将i偏移1并执行此操作,这样可行:

- (NSArray *)reverseArray:(NSMutableArray *)array {
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
    for (NSUInteger i = [array count]; (i) ; i--) {
        [anArray addObject:[array objectAtIndex:i - 1]];
    }
    return anArray;
}
Run Code Online (Sandbox Code Playgroud)

我只是不明白为什么第一种方法不起作用.任何帮助,将不胜感激.谢谢!

Yuj*_*uji 5

NSUInteger是一个unsigned整数.所以,如果NSUInteger u=0你计算u-1,它就不会变成-1.相反,它会下溢并成为一个超级巨大的数字.

将代码更改为

 for (NSInteger i = [array count] - 1; i >= 0 ; i--) {
Run Code Online (Sandbox Code Playgroud)

应该解决问题.

请注意,您实际上不必反转数组.for循环

for(a in array){
    ... do something with a ...
}
Run Code Online (Sandbox Code Playgroud)

枚举前向顺序中的元素,和

for(a in [array reverseObjectEnumerator]){
    ... do something with a ...
}
Run Code Online (Sandbox Code Playgroud)

以相反的顺序枚举元素.