Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Неизменяемые  объекты Objective-C

0

При создании экземпляра NSArray указываются все объекты, которые в нем должны храниться. Обычно это выглядит так:

NSArray *colors = [NSArray arrayWithObjects:@"Orange", @"Yellow", @"Green", nil];

Значение nil в конце списка показывает, где метод должен прекратить добавление новых элементов. В нашем примере массив colors будет содержать три строки. (Если вы забудете nil, скорее всего, это приведет к аварийному завершению программы.)

Многих   начинающих   программистов   удивляет   сам   факт   существования

NSArray.  Зачем  нужен  список,  содержимое  которого  нельзя  изменить?  Есть  две причины:

•  Вы не доверяете людям, с которыми работаете. Иначе говоря, вы хотите разрешить им просмотр массива, но не изменение его содержимого. Другое, более деликатное решение – предоставить им NSМutаblеАrrау, но выдать его NSArray. Например,

представьте себе следующий метод:

// Возвращает массив из 30 нечетных чисел

-­‐  (NSArray *)odds

{

static NSMutableArray *odds = [[NSMutableArray alloc] init]; int i = 1;

while ([odds count] < 30) {

[odds addObject:[NSNumber numberWithInt:i]; i += 2;

}

return odds;

}

Каждый, кто вызывает этот метод, считает, что он возвращает неизменяемый массив NSArray. Если вызывающая сторона попытается добавить или удалить элементы из возвращенного объекта, компилятор выдает суровое предупреждение – хотя на самом деле возвращается экземпляр NSМutаblеАrrау.

•  Другая причина для использования неизменяемых объектов – производительность; неизменяемые объекты не нужно копировать. При работе с из- меняемым объектом иногда приходится создавать приватную копию, чтобы быть уверенным в том, что другой код не сможет модифицировать объект незаметно для вас. Для неизменяемых объектов это не обязательно. Более того, метод сору класса NSМutаblеАrrау создает

новую копию самого себя и возвращает указатель на новый массив, а метод сору класса NSArray не делает ничего – он просто возвращает указатель на самого себя.

По этим причинам неизменяемые объекты достаточно часто используются

в программировании Objective-C. В Foundation неизменяемые экземпляры создаются многими классами: NSArray, NSString, NSAttributedString, NSData, NSCharacterSet, NSDictionary, NSSet, NSIndexSet и NSURLRequest. Все эти классы имеют изменяемые субклассы: NSМutаblеАrrау, NSМutаblеstriпg, NSМutаblеАttributеdString и. т. д. Классы NSDate и NSNumber тоже относятся к неизменяемым, но не имеют изменяемых субклассов.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии