ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

NSMutableArray (изменяемые массивы)

Как и в ситуации с NSString — у класса NSArray существует саб-класс NSMutableArray, который позволяет изменять свои экземпляры.

Чтобы опробовать основные возможности класса NSMutableArray — создадим новый проект на основе представления (View-based Application) и назовите его MutableArrays. Теперь откройте файл MutableArraysViewController.m и раскомментируйте в нем методviewDidLoad. Затем добавьте в него несколько строк:

<code data-result="[object Object]">NSMutableArray *a1 = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *a2 = [[NSMutableArray alloc] initWithCapacity:10];
[a2 release];</code>

Как видите, метод инициализации очень похож на методы инициализации класса NSMutableString. Теперь давайте попробуем добавить объекты в наш только что созданный массив a1. В этом нам поможет метод addObject в параметре которого мы и передаем тот самый объект, который хотим добавить.

<code data-result="[object Object]">[a1 addObject:@"Martin"];
[a1 addObject:@"Cyndi"];
[a1 addObject:@"Hyman"];</code>

Давайте выведем наш массив в консоль и убедимся, что мы все сделали правильно.

<code data-result="[object Object]">NSLog(@"%@", a1);</code>

В результате выполнения этого кода мы получим:

2011-03-18 19:55:33.730 MutableArrays[5964:207] (

    Martin,

    Cyndi,

    Hyman

)

Следующий код демонстрирует возможность добавления к нашему массиву элементов другого массива.

<code data-result="[object Object]">NSArray *array = [NSArray arrayWithObjects:@"Stefan", @"Shane", @"Ray", 
@"Rudy", @"Piter", @"Oleg", @"Vladimir", nil];
[a1 addObjectsFromArray:array];
NSLog(@"%@", a1);</code>

В первой строке мы создаем обычный массив (этот процесс я описывал в предыдущей статье). Затем элементы нового массива добавляем в массив а1 и результат выводим в консоль.

При добавлении нового объекта в массив мы можем указать ему индекс. При этом все остальные объекты как бы «сдвинуться»:

<code data-result="[object Object]">[a1 insertObject:@"Ivan"atIndex:2];
NSLog(@"%@", a1);</code>

При этом следует помнить, что нумерация объектов начинается с нуля, поэтому только что добавленный объект стал на третье место:

2011-03-18 19:55:33.735 MutableArrays[5964:207] (

    Martin,

    Cyndi,

    Ivan,

    Hyman,

    Stefan,

    Shane,

    Ray,

    Rudy,

    Piter,

    Oleg,

    Vladimir

)

Давайте рассмотрим методы удаления объектов с массива.

<code data-result="[object Object]">[a1 removeLastObject];
[a1 removeObject:@"Ivan"];
[a1 removeObjectAtIndex:3];
[a1 removeObjectIdenticalTo:@"Ray"];
NSLog(@"%@", a1);</code>

В первом методе мы удаляем последний объект. Во втором — удаляем объект со значением @»Ivan». Затем удаляем объект под индексом 3. Работа метода removeObjectIdenticalTo складывается с двух методов. Сначала с помощью уже известного нам методаindexOfObjectIdenticalTo компилятор ищет объект в массиве, затем определяет его индекс и удаляет с помощью методаremoveObjectAtIndex. В конце всех удалений мы выводим массив в консоль, как вы заметили — он существенно изменился.

Продолжим удалять объекты:

<code data-result="[object Object]">NSArray *objectsToRemove = [NSArray arrayWithObjects:@"Martin", @"Rudy", nil];
[a1 removeObjectsInArray:objectsToRemove];
NSLog(@"%@", a1);</code>

В этом коде перед удалением мы создаем массив тех объектов, которые хотим удалить с нашего исходного массива. Затем, с помощью метода removeObjectsInArray, в который мы передаем наш только что созданный массив — мы удаляем с исходного массива объекты, которые совпали с объектами только что созданного массива.

Следующий пример работает подобно методу deleteCharactersInRange класса NSMutableString.

<code data-result="[object Object]">[a1 removeObjectsInRange:NSMakeRange(0, 2)];
NSLog(@"%@", a1);</code>

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

В случае, если вы захотите удалить все объекты массива — лучше всего использовать метод removeAllObjects:

<code data-result="[object Object]">[a1 removeAllObjects];
NSLog(@"%@", a1);</code>

Кроме всего прочего вы можете, вы можете явно указать значение вашего массива.

<code data-result="[object Object]">NSArray *newArray = [NSArray arrayWithObjects:@"Lida", @"Dasha", @"Vera", nil];
[a1 setArray:newArray];
NSLog(@"%@", a1);</code>

После выполнения этого кода ваш массив получит значения массива, который мы передали в качестве параметра метода setArray, в нашем случае это массив newArray.

Важной возможностью изменяемых массивов является возможность замены объектов.

<code data-result="[object Object]">[a1 replaceObjectAtIndex:1 withObject:@"Olga"];
NSLog(@"%@", a1);</code>

В качестве параметров этого метода мы передаем индекс объекта который хотим заменить и значение нового объекта.

В дальнейшем, когда мы будем рассматривать работу UITableView — нам будет нужен метод exchangeObjectAtIndex.

<code data-result="[object Object]">[a1 exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"%@", a1);</code>

Этот метод меняет местами объекты внутри массива. В качестве параметров этого метода мы указываем индексы тех объектов, которые хотим поменять местами.

Это далеко не все методы класса NSMutableArray, если кто-то считает статью не полной — пишите в комментарии

Исходный код можно скачать здесь.

Comments are closed.