Здесь есть несколько проблем:
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 или добавьте условие в свой код для отдельной обработки этого особого случая.