Ответ заключается в том, что NSMutableArray всегда начинается с нулевого размера.Если вы хотите, чтобы это было так, вы можете сделать что-то вроде этого:
NSMutableArray* anArray = [NSMutableArray arrayWithSize: 2000];
[anArray replaceObjectAtIndex: 1999 withObject: foo];
, вам необходимо предварительно заполнить массив объектами NSNull, например,
@implementation NSArray(MyArrayCategory)
+(NSMutableArray*) arrayWithSize: (NSUInteger) size
{
NSMutableArray* ret = [[NSMutableArray alloc] initWithCapacity: size];
for (size_t i = 0 ; i < size ; i++)
{
[ret addObject: [NSNull null]];
}
return [ret autorelease];
}
@end
Редактировать: некоторые дополнительные пояснения:
-initWithCapacity:
дает подсказку времени выполнения о том, насколько большим, по вашему мнению, может быть массив.Время выполнения не обязано фактически выделять этот объем памяти сразу.
NSMutableArray* foo = [[NSMutableArray alloc] initWithCapacity: 1000000];
NSLog(@"foo count = %ld", (long) [foo count]);
будет записывать счетчик 0. 0. 1013 *
-initWithCapacity:
не ограничивает размер массива:
NSMutableArray* foo = [[NSMutableArray alloc] initWithCapacity: 1];
[foo addObject: @"one"];
[foo addObject: @"two"];
не вызывает ошибку.