Программирование на Objective-C 2.0
Шрифт:
Так можно избежать бесконечного цикла, поскольку это предусмотрено в самом методе. Откуда берутся все эти объекты?
В программах 15.4 и 15.5 выполняется работа со многими строковыми объектами, которые создаются и возвращаются разными методами классов NSString и NSMutableString. Вам не нужно думать об освобождении памяти, занимаемой эти-ми объектами; это предусмотрено в методах-создателях объектов. Предполага-ется, что создатели добавили все эти объекты в автоматически высвобождаемый пул (autorelease-пул), и объекты будут высвобождены, когда будет высвобожден сам пул. Однако если вы разрабатываете программу, которая создает много временных объектов, то память, используемая ими, может накапливаться. В таких случаях, возможно, придется освобождать память во время выполнения программы. Это описывается в главе 17, На данный момент просто учтите, что объекты занимают намять, которая может увеличиваться по мере выполнения программы.
Класс NSString содержит более 100 методов, которые
В таблицах 15.2 и 15.3, url — это объект NSURL, path — это объект NSString, указывающий путь к файлу, nsstring — это объект NSString, / — это значение типа NSUInteger, представляющее допустимый номер символа в строке, епс — это объект NSStringEncoding, указывающий кодировку символов, err — это объект NSError, который описывает ошибку, если она возникла, size (размер) и орй(опции) имеют тип NSUInteger, и range — это объект NSRangc, указывающий допустимый диапазон символов в списке.
Табл. 15.2. Наиболее распространенные методы класса NSString Метод Описание +(id) stringWithContentsOfFile: path encoding; enc error: err Создает новую строку и присваивает ей содержимое файла, указанного аргументом path, в кодировке символов enc; возвращает ошибку в err, если не nil. +(id) stringWithContentsOfURL: url encoding: enc error: err Создает новую строку и присваивает ей содержимое url в кодировке символов enc, возвращает ошибку в err, если не nil. +(id) string Создает новую пустую строку +(id) stringWithString: nsstring Создает новую строку и присваивает ей nsstring. -(id) initWithString: nsstring Присваивает вновь выделяемой строке nsstring. -(id) initWithContentsOfFile: path encoding: enc error: err Присваивает строке содержимое файла, указанного аргументом path. -(id) initWithContentsOfURL: w/encoding enc error: ей Присваивает строке содержимое u//(NSURL *) в кодировке символов enc; возвращает ошибку в err, если не nil. -(NSUInteger) length Возвращает число символов в строке. -(unichar) characterAtlndex: i Возвращает символ Unicode, находящийся в позиции с индексом i -(NSString *) substringFromlndex: i Возвращает подстроку от символа с индексом i до конца. -(NSString *) siibstringWithRange: range Возвращает подстроку в соответствии с указанным диапазоном. -(NSString *) substringToIndex: i Возвращает подстроку от начала строки вплоть до символа с индексом i. -(NSComparator *) caselnsensitiveCompare: nsstring Сравнение двух строк независимо от регистра букв. -(NSComparator *) compare: nsstring Сравнение двух строк. -(BOOL) hasRrefix: nsstring Проверка, что строка начинается с nsstring. -(BOOL) hasSuffix: nsstring Проверка, что строка заканчивается nsstring. -(BOOL) isEqualToString: nsstring Проверка, что две строки равны. -(NSString *) capitalizedString Возвращает строку, делая прописной первую букву каждого слова (и строчными все остальные буквы каждого слова). -(NSString *) lowercaseString Возвращает строку, преобразованную в нижний регистр. -(NSString *) uppercaseString Возвращает строку, преобразованную в верхний регистр. -(const char *) UTF8String Возвращает строку, преобразованную в С-строку в кодировке UTF-8. -(double) doubleValue Возвращает строку, преобразованную в значение типа double. -(tloat) floatValue Возвращает строку, преобразованную в значение с плавающей точкой. -(NSInteger) integerValue Возвращает строку, преобразованную в целое значение NSInteger. -(int) intValue Возвращает строку, преобразованную в целое значение.
Методы, которые приводятся в таблице 15.3, создают или модифицируют объекты класса NSMutableString.
Табл. 15.3. Наиболее распространенные методы класса NSMutableString Метод Описание +(id) stringWithCapacity: size Создает строку, содержащую первоначально size символов. -(id) initWithCapacity: size Инициализирует строку с начальной длиной size символов. -(void) setstring: nsstring Присваивает строке nsstring. -(void) appendString: nsstring Добавляет nsstring в конец строки-получателя. -(void) deleteCharactersInFtange: range Удаляет символы в указанном диапазоне. -(void) insertstring; nstring atlndex: i Выполняет вставку nsstring в строку-получатель, начиная с индекса i. -(void) replaceCharactersInRange: range withString: nsstring Выполняет замену символов в указанном диапазоне на nsstring. -(void) replaceOccurrencesOfString: nsstring withString: nsstring2 options: opts range: range Выполняет замену всех экземпляров nsstring на nsstring2 в указанном диапазоне и в соответствии с опциями opts. Опции могут представлять побитовую OR-комбинацию NSBackwardsSearch (поиск начинается с конца диапазона), NSAnchoredSearch (совпадение nsstring должно быть только с начала диапазона), NSUteraiSearch (выполняется побайтовое сравнение) и NSCaselnsensitiveSearch.
Объекты класса NSString широко используются в этой книге. Для разбора арок на маркеры нужно рассмотреть класс Foundation NSScanner. 15.3. Объекты-массивы
Массив в Foundation —
это упорядоченный набор объектов. Чаще всего (но не обязательно) элементы массива имеют один определенный тип. Аналогично мутабельным и немутабсльным строкам, существуют мутабельные и немута- бельные массивы. Для работы с немутабельными (immutable) массивами исполь-зуется класс NSArray; для мутабельных (mutable) массивов используется класс NSMutableArray. Последний класс является подклассом предыдущего и наследует его методы. Для работы с объектам и-массивам и в программах нужно включить строку #import <Foundalion/NSArray.h>В программе 15.6 задастся массив для хранения названий месяцев, а затем выводятся названия месяцев. #import <Foundation/NSObject.h> #import <Foundation/NSArray.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv[]) { int i; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Создание массива, содержащего названия месяцев NSArray *monthNames = [NSArray arrayWithObjects: @"January", @"February", @"March", @"April", @"May", @"June", @"July'', @"August", @"September", @"October", @"November", @"December", nil ]; // Теперь вывод всех элементов этого массива NSLog (@"Month Name"); NSLog (@"===== ===="); for (i = 0; i < 12; ++i) NSLog (@" %2i %@", i + 1, [monthNames objectAtlndex: i]); [pool drain]; return 0; }
Вывод программы 15.6 Month Name 1 January 2 February 3 March 4 April 5 May 6 June 7 July 8 August 9 September 10 October 11 November 12 December
Метод этого класса arrayWithObjects: создает массив со списком объектов в виде его элементов. Объекты перечисляются по порядку и разделяются запятыми. Это специальный синтаксис методов, которые принимают переменное число аргументов. Чтобы закончить список, нужно поставить nil в качестве последнего значения списка (nil не сохраняется внутри массива).
В программе 15.7 массиву monthNames присваиваются 12 строковых значений в виде аргументов для метода arrayWithObjects:.
Элементы массива идентифицируются своим индексом (порядковым номе-ром). Аналогично объектам класса NSString, индексирование начинается с нуля, поэтому массив, содержащий 12 элементов, имеет допустимые индексы 0-11. Метод objectAdndex: считывает элемент массива но его индексу.
В этой программе каждый элемент из массива считывается с помощью метода objectAUndex: в цикле for. Каждый считываемый элемент выводится с помощью NSLog.
В программе 15.7 создается таблица простых (prime) чисел. Поскольку про-стые числа добавляются в массив по мере их создания, здесь требуется мута- бельный массив. Память для объекта primes класса NSMutableArray выделяется с помощью метода arrayWithCapacity:. Указанный аргумент 20 задаст начальный размер массива; размер мутабельного массива автоматически увеличивается во время выполнения программы.
Хотя простые числа являются целыми, мы не можем сохранять значения типа int внутри этого массива. Данный массив может содержать только объекты, поэтому нам нужно сохранять в массиве primes целые объекты класса NSNumber. #import <Foundalion/NSObject.h> #import <Foundation/NSArray.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> #import <Foundation/NSValue.h> #define MAXPRIME 50 int main (int argc, char *argv[]) { int i, p, prevPrime; BOOL isPrime; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Создание массива для хранения простых чисел NSMutableArray *primes = [NSMutableArray arrayWithCapacity: 20]; // Сохранение в массиве первых двух простых чисел (2 и 3) [primes addObject: [NSNumber numberWithlnteger: 2]]; [primes addObject: [NSNumber numberWithlnteger: 3]]; // Вычисление остальных простых чисел for (р = 5; р <= MAXPRIME; р += 2) { // проверяется, что р - простое число isPrime = YES; i = 1; do { prevPrime = [[primes objectAtlndex: i] integerValue]; if (p % prevPrime == 0) isPrime = NO; ++i; } while (isPrime == YES && p / prevPrime >= prevPrime); if (isPrime) [primes addObject: [NSNumber numberWithlnteger: p]]; } // Вывод результатов for (i = 0; i < [primes count]; ++i) NSLog (@"%li", (long) [[primes objectAtlndex: i] integerValue]); [pool drain]; return 0; }
Вывод программы 15.7 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
kMaxPrime определяется как максимальное простое число для вычислений (в данном случае 50).
После выделения памяти для массива primes задаются два первых элемента массива с помощью следующих операторов. [primes addObject: [NSNumber numberWithlnteger: 2]]; [primes addObject: [NSNumber numberWithlnteger: 3]];
Метод addObject: добавляет объект в коней массива. В данном случае добав-ляются объекты класса NSNumber, создаваемые соответственно из целых значе-ний 2 и 3.
Затем в программе начинается цикл for для поиска простых чисел, начиная с 5, вплоть до kMaxPrime с пропуском промежуточных четных чисел (р += 2).
Для каждого возможного числа р проверяется его делимость на предыдущие простые числа. В случае делимости р не является простым числом. Для ускорения мы проверяем делимость только на простые числа, не превышающие квадратный корень из р. Дело в том, что если число не является простым, оно должно делиться на простое число, которое не больше его квадратного корня. Поэтому выражение р / prevPrime >= prevPrime