Реверсивные элементы в массиве в target-c - PullRequest
0 голосов
/ 12 июля 2011

Есть что-то, чего мне не хватает в 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;
}

Это дает мне предупреждение компилятора, что i> = 0 - это то, для чего предназначен NSUInteger или что-то в этом роде. Когда я запускаю программу, она также дает сбой и получает доступ к какому-то супер огромному числу. Я не совсем уверен, почему. Я могу сместить меня на 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;
}

Я просто не понял, почему первый метод не работает. Любая помощь будет оценена. Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 июля 2011

NSUInteger - это целое число unsigned. Итак, если NSUInteger u=0 и если вы вычислите u-1, оно не станет -1. Вместо этого он падает и становится огромным числом.

Изменение вашего кода на

 for (NSInteger i = [array count] - 1; i >= 0 ; i--) {

должен решить проблему.

Обратите внимание, что вам на самом деле не нужно инвертировать массив. Петля for

for(a in array){
    ... do something with a ...
}

перечисляет элементы в прямом порядке, а

for(a in [array reverseObjectEnumerator]){
    ... do something with a ...
}

перечисляет элементы в обратном порядке.

1 голос
/ 12 июля 2011

Целое число без знака всегда> = 0. Таким образом, ваш первый цикл никогда не завершится, что в конечном итоге приведет к попытке доступа к objectAtIndex:(NSUInteger)-1, который на самом деле является очень большим положительным индексом, вызывая сбой.

К счастью, вы, похоже, уже поняли, как решить проблему. Хорошая работа.

Обратите внимание, что в этом нет ничего специфического для Objective-C; программисты обычно делают ту же ошибку с целыми числами без знака практически в любом подходящем языке низкого уровня.

0 голосов
/ 12 июля 2011

NSUInteger является "без знака", что означает, что он не может иметь знак -, обозначающий отрицательное число.В вашем коде ...

NSUInteger i = [array count] - 1; i >= 0 ; i--

Это в конечном итоге будет равно -1, отсюда и ошибка.Попробуйте удалить = для чего-то вроде этого.

NSUInteger i = [array count] - 1; i > 0 ; i--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...