Инициализировать NSArray с размером

Как мне инициализировать NSArray только размером, чтобы использовать цикл for для его заполнения позже? Мой цикл for будет

for (int i = 0; i < [myArray count]; i++) {
    myArray[i] = someData;
}

person Katedral Pillon    schedule 09.12.2014    source источник
comment
Итак, все ответы говорят о том, что я должен использовать NSMutableArray, а не NSArray. Означает ли это, что я не могу напрямую использовать NSArray для решения этой проблемы?   -  person Katedral Pillon    schedule 09.12.2014
comment
NSArray является неизменяемым, что означает, что его содержимое нельзя будет редактировать в будущем. Это также предотвращает добавление или удаление каких-либо объектов из массива, поэтому его длина всегда будет оставаться постоянной. С другой стороны, NSMutableArray является изменчивым, поскольку объекты всегда могут быть добавлены или удалены в любой момент времени, даже после инициализации.   -  person max_    schedule 09.12.2014
comment
Мое ограничение заключается в том, что я не хочу, чтобы размер менялся непреднамеренно, но в то же время я хочу, чтобы пользователь мог обновлять значения. Массив является логическим массивом. Я родом с Явы, так что вы понимаете мои проблемы. NSMutableArray означает, что размер может увеличиваться. Итак, как мне предотвратить непреднамеренное изменение размера, позволяя изменять значения?   -  person Katedral Pillon    schedule 09.12.2014
comment
@KatedralPillon Вы не можете сделать это ни с одним из встроенных классов. Вы можете обернуть NSMutableArray в свой собственный класс или подкласс, если хотите.   -  person Aaron Brager    schedule 09.12.2014
comment
Если вы просто храните BOOL, вы можете использовать массив C.   -  person Aaron Brager    schedule 09.12.2014
comment
Но похоже, что вам, вероятно, понадобится собственный класс данных с общедоступным интерфейсом, который (приватно) использует NSMutableArray для хранения своих данных.   -  person Aaron Brager    schedule 09.12.2014
comment
Как сказал @AaronBrager, вместо этого вы можете просто использовать массив C. Если вам не нужны какие-либо методы в NSArray, то это будет ваш лучший вариант. В противном случае используйте NSMutableArray   -  person Eric Amorde    schedule 09.12.2014


Ответы (2)


Вам не нужно инициализировать его с определенным размером — вы можете добавить объекты позже:

NSMutableArray *myArray = [NSMutableArray array];

for (int i = 0; i < 100; i++) {
    [myArray addObject:someData];
}

Есть небольшой прирост производительности, если вы заранее знаете размер:

NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:100];

Но это необязательно.

person Aaron Brager    schedule 09.12.2014

NSNull — это класс, используемый для представления неустановленного, недопустимого или несуществующего объекта. Поэтому вы можете дополнить массив до определенного размера, используя экземпляры этого класса.

NSUInteger sizeOfArray = 10;
NSMutableArray *someArray = [NSMutableArray array];
for (NSUInteger i = 0; i < sizeOfArray; i++) {
    [someArray addObject:[NSNull null]];
}

Кроме того, вы не можете использовать синтаксис someArray[i] = xyz;, если значение в позиции i не существует, так как это вызовет ошибку выхода за пределы.

person max_    schedule 09.12.2014
comment
Есть ли способ выделить массив, чтобы позже я мог сделать array[i] = obj, не добавляя что-то перед ним с помощью addObject? - person Lord Zsolt; 08.09.2015