Массивы в Objective-C с Cocoa / CocoaTouch сильно отличаются от Java.Три основных различия:
Массивы Obj-C являются просто классами, как и любые другие, и не имеют встроенной поддержки в языке.В Java массивы имеют встроенную поддержку языка через операторы []
.
Массивы Obj-C являются нетипизированными, они принимают любой объект, который наследуется от NSObject
,Это означает, что вы можете смешивать типы в одном и том же массиве, хотя это, вероятно, плохая практика, если у вас нет веских причин для этого.(Обратите внимание, что int
, double
, char
, BOOL
и другие встроенные типы не наследуются от NSObject
, поэтому вам придется заключать их в объекты NSNumber
, если вы когда-либо захотитеудерживайте их в массиве.)
Массивы Obj-C на самом деле не имеют концепции фиксированной длины, если только весь массив не является неизменным.Поэтому вам не нужно выбирать длину при создании массива.
Чтобы создать изменяемый массив, то есть тот, где вам разрешено изменять объекты (и даже добавлять иудаляя объекты, изменяя длину массива), вы создаете NSMutableArray
:
myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.
Чтобы добавить объект, например, экземпляр вашего Person
, вы вызываете метод addObject:
, либоновый Person
прямо здесь или указатель на существующий:
[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.
Чтобы удалить объект, вы можете использовать removeObjectAtIndex:
или removeLastObject
.Для замены звоните replaceObjectAtIndex:withObject:
.Чтобы вставить объект в середину массива (и помните, что это также увеличит размер массива), вы вызываете insertObject:atIndex:
.
, который охватывает наиболее важные мутирующие методы.т. е. специфичные для NSMutableArray
.Конечно, у вас также есть методы, которые наблюдают только за массивом, и они определены в NSArray
.Наиболее важными из них являются count
с указанием текущего числа элементов и objectAtIndex:
с указанием объекта по указанному вами индексу.
Предположим, у вас есть Person
объектов в вашем массиве, вы можетеитерируйте их следующим образом:
for (int i = 0; i < [myArray count]; i++) {
Person* p = [myArray objectAtIndex: i];
// Do something with p
}
Вы можете задаться вопросом, как создать NSArray
как таковой, если вам не разрешено добавлять к нему.Ну, один из его конструкторов - initWithObjects:
, который позволяет вам написать список объектов, разделенных запятыми, для добавления (и вам нужно закончить значением nil
).Другим является initWithArray:
, который позволяет передавать другой массив (который может быть изменяемым), и конструктор будет использовать объекты из предоставленного массива при создании нового.