NSMutable Array за пределами - PullRequest
       1

NSMutable Array за пределами

0 голосов
/ 06 сентября 2011

У меня есть блок кода, который при выполнении выдает мне эту ошибку.И я относительно новичок, похоже, я не могу решить проблему.

Ошибка: 2011-09-06 12: 31: 06.094 ForceGauge [266: 707] CoreAnimation: игнорируется исключение: * - [NSMutableArray objectAtIndex:]: индекс 1 за пределами [0 .. 0]

-(void)peakCollector:(NSMutableArray *)testarray {

    NSUInteger totalRows = [testarray count];

    NSMutableArray *percentArray = [[NSMutableArray alloc]initWithObjects:0, nil];

    if(forcecontroller.selectedSegmentIndex==0)
        testarray = lbData;
    else if(forcecontroller.selectedSegmentIndex==1)
        testarray = kgData;     
    else if(forcecontroller.selectedSegmentIndex ==2)
        testarray = ozData;
    else if(forcecontroller.selectedSegmentIndex ==3)
        testarray = newtonData;

    for(int i = 0; i< totalRows-1; i++) {

        if ([[testarray objectAtIndex:i+1] doubleValue] >= 1.2 * [[testarray objectAtIndex:i] doubleValue]) {
            percentArray = [testarray objectAtIndex:i];

            DatabaseTable *tableVC = [[DatabaseTable alloc] initWithStyle:UITableViewStylePlain];
            [self.navigationController pushViewController:tableVC animated:YES];

            if(forcecontroller.selectedSegmentIndex==0)
                [tableVC copydatabase:percentArray];
            else if(forcecontroller.selectedSegmentIndex==1)
                [tableVC copydatabase:kgData];
            else if(forcecontroller.selectedSegmentIndex==2)
                [tableVC copydatabase:ozData];
            else if(forcecontroller.selectedSegmentIndex==3)
                [tableVC copydatabase:newtonData];

            [tableVC release];
        } else {
            [analogData removeAllObjects];
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

Здесь есть несколько проблем:

1) NSArrays может содержать только объекты NSO.

В вашем коде вы инициализируете NSArray, используя [[NSMutableArray alloc]initWithObjects:0, nil];, но 0 - это атомарный тип, а не NSObject (и в основном 0 - это то же значение, что и nil (nil и NULL обычно равны 0, что интерпретируется как типы id и void* соответственно)

Вместо этого вы должны инкапсулировать ваше значение 0 в NSNumber:

[[NSMutableArray alloc]initWithObjects:[NSNumber numberWithInt:0], nil];

Затем получите NSNumber с помощью [percentArray objectAtIndex:0] и, наконец, преобразуйте обратно полученный NSNumber в int, используя NSNumber intValue метод:

NSNumber* number = [percentArray objectAtIndex:0]; // returns an NSNumber which is an NSObject encapsulating numbers, see Apple's documentation
int val = [number intValue]; // retrieve the integer value encapsulated in the NSNumber
// or directly:
// int val = [[percentArray objectAtIndex:0] intValue];

2) Исключение, которое вы получили, на самом деле в другом месте и гораздо более тонкое : вы извлекаете значение [testarray count] в переменной NSUInteger, которая является типом без знака. Тогда totalRows-1 сделает некоторые хитрые вещи, если totalRows равен 0 (что, очевидно, имеет место с учетом имеющегося у вас исключения).

Поскольку totalRows является NSUInteger, когда оно равно 0, totalRows-1 будет не равно -1, а ... (NSUInteger)-1 (-1 интерпретируется как целое число без знака), что равно 0xFFFFFFFF, а именно максимальное значение типа NSUInteger!

Именно поэтому i всегда меньше, чем это totalRows-1 значение (поскольку это значение не -1, а 0xFFFFFFFF = NSUInteger_MAX ).

Чтобы решить эту проблему, приведите вашу переменную totalRows к значению NSInteger или добавьте условие в свой код для отдельной обработки этого особого случая.

0 голосов
/ 06 сентября 2011

Ошибка просто означает, что вы пытаетесь получить объект по индексу, который не существует. В вашем конкретном случае массив, из которого вы пытаетесь получить объект, не имеет объекта с индексом 1

Простой пример

[0] => MyCoolObject
[1] => MySecondObject
[2] => ObjectTheThird

Вы можете получить доступ к индексам 0,1,2 вашего массива, поскольку они содержат объекты. Если вы сейчас попытаетесь получить доступ к индексу 3, он выдаст исключение Out of bounds, так как индекс 3 не существует.

0 голосов
/ 06 сентября 2011

Пожалуйста, проверьте, сколько тестового массива объектов содержит в начале цикла for.

Другая вещь, которая может помочь, это избежать NSUInteger и использовать простое int для хранения количества массивов.

Пожалуйста, опубликуйтеесли это не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...