Программирование на Objective-C 2.0
Шрифт:
Используя класс Fraction, определенный в части I, создайте мутабельный мас-сив дробей (fraction) с произвольными значениями. Затем отсортируйте этот массив с помощью метода sortUsingSelector: из класса NSMutableArray. Добавьте в класс Fraction категорию Comparison (сравнение) и реализуйте свой метод сравнения в этой категории.
Определите три новых класса с именами Song, PlayList и MusicCollection. Объект класса Song должен содержать информацию об определенной песне, например, ее название (title), исполнителя (artist), альбом (album) и время воспроизведения (playing time). Объект класса PlayList должен содержать имя списка воспроизведения и коллекцию песен. Объект класса MusicCollection должен содержать коллекцию списков воспроизведения,
Создавать объект класса Song и задавать его информацию.
Создавать объект класса Playlist и добавлять или удалять песни из списка воспроизведения. Новая песня должна добавляться в мастер-список, если ее еще там нет. При удалении песни из мастер-списка она должна удаляться из всех списков воспроизведения этой музыкальной коллекции.
Создавать объект класса MusicCollection и добавлять в него или удалять из него объекты класса Playlist (списки воспроизведения)
Выполнять поиск и вывод информации о любой песне, любом списке воспроизведения или всей музыкальной коллекции. Проследите, чтобы во всех классах не было утечки памяти!
Напишите программу, которая создает из массива объектов типа NSInteger гистограмму, где показано каждое целое значение вместе с числом экземп-ляров этого значения (частотой появления) в массиве. Для создания счетчиков экземпляров используйте объект NSCountedSet.
Глава 16. Работа с файлами
Foundation framework позволяет получать доступ к файловой системе для вы-полнения основных операций с файлами и папками (каталогами) с помощью NSFileManager, методы которого позволяют выполнять следующие операции.
Создание нового файла.
Чтение из существующего файла.
Запись данных в файл.
Переименование файла.
Удаление файла.
Проверка существования файла.
Определение размера файла, а также других атрибутов.
Создание копии файла.
Проверка двух файлов на совпадение содержимого.
Многие из этих операций можно также выполнять с папками. Например, можно создать папку, прочитать ее содержимое или удалить се. Еще одна возможность — это возможность привязки (link) файлов. Привязка означает, что один и тот же файл может существовать под двумя именами и даже в двух различных папках.
Чтобы открыть файл и выполнить с этим файлом несколько операций чте-ния-записи, используются методы из NSFileHandle. Методы этого класса позво-ляют следующее.
Открывать файл для чтения, записи или изменения (update — чтение и запись).
Искать указанное местоположение в файле.
Считывать или записывать заданное число байтов из файла или в файл. Методы из NSFileHandle можно также применять к устройствами (сокетам). В этой главе мы будем работать только с обычными файлами. 16.1. Управление файлами и папками: NSFileManager
Файл или папка уникально указывается для NSFileManager с помощью имени пути доступа к файлу (pathname). Имя пути — это объект класса NSString, который может представлять относительное или полное имя пути. Относительное имя пути определяется относительно текущей папки. Например, имя файла copyl.m означает, что файл copyl.m находится в текущей папке. Символы «слэш» являются разделителями папок в указанном пути. Имя файла ch16/copy1.m тоже является относительным именем пути, указывая файл copyl .m, хранящийся в папке chi6, которая содержится в текущей папке.
Полные имена пути, которые также называют абсолютными именами пути, начинаются с ведущего слэша (/). Слэш на самом деле представляет папку, ко-торая называется корневой (root) папкой. На моем Мае полное имя пути к моей домашней папке — /Users/stevekochan. Этот путь представляет три папки: / (корне-вая папка), Users и stevekochan.
Специальный символ «тильда» (~) используется как сокращенное представ-ление домашней
папки пользователя. Так, -linda — это сокращение для домашней папки пользователя linda, которая может быть представлена в виде пути / Users/linda. Отдельный символ «тильда» указывает домашнюю папку текущего пользователя, путь -/copyl.m означает ссылку на файл copyl.m, хранящийся в до-машней папке текущего пользователя. Другие специальные символы для пути в стиле UNIX, такие как точка (.) для текущей папки и .. для родительской папки, следует удалять из имен пути при работе с файлами в методах Foundation. Для этого можно использовать разнообразные утилиты, которые будут рассмат-риваться ниже в этой главе.Избегайте фиксированных путей в своих программах. Как будет описано далее, имеются функции и методы, которые позволяют получать имя пути для текущей папки, домашней папки пользователя и папки для создания временных файлов. Обращайтесь к ним, насколько это возможно. Ниже мы покажем, что Foundation содержит функцию для получения списка специальных папок, таких как папки пользователя Documents.
В таблице 16.1 приводится сводка основных методов NSFileManager для работы с файлами. В этой таблице path (путь), path}, palh2,from (из) и !о (куда) — объекты класса NSString, attr (атрибут) - объект NSDictionary, handler - обработчик (хендлср) обратного вызова, который вы можете предоставлять для обработки ошибок. Если указать nil для handler, то выполняется действие по умолчанию. Для методов, возвращающих значение типа BOOL, это YES при успешном завершении операции и N0, если операцию не удалось выполнить. В этой главе не товорится о том, как писать хендлеры.
Табл. 16.1. Наиболее распространенные файловые методы класса NSFileManager Метод Описание– (NSData *) contentsAtPath: path Читает данные из файла. -(BOOL) createFileAtPath: path contents: (BOOL) data attributes: attr Пишет данные (data) в файл -(BOOL) removeFileAtPath: path handler: handler Удаляет файл. -(BOOL) movePath: from toPath: to handler: handler Переименовывает или перемещает файл (to не может существовать заранее). -(BOOL) copyPath: from toPath: to handler: handler Копирует файл (to не может существовать заранее). -(BOOL) contentsEqualAtPath: path1 andPath: path2 Сравнивает содержимое двух файлов. -(BOOL) fileExistsAtPath: path Проверяет существование файла. -(BOOL) isReadableRleAtPath: path Проверяет, существует ли файл и доступен ли он для чтения. -(BOOL) isWritableFileAtPath: path Проверяет, существует ли файл и доступен ли он для записи. -(NSOictionary *) fileAttributesAtPath: path traverseLink: (BOOL) flag Читает атрибуты файла. -(BOOL) changeFileAttributes: attr atPath: path Изменяет атрибуты
Каждый из этих файловых методов вызывается в объекте NSFileManager, который создается при отправке сообщения defauttManager этому классу. NSFileManager *fm; ... fm = [NSFileManager defaultManager];
Например, для удаления файла todolist из текущей папки нужно создать сна-чала объект класса NSFileManager, как показано выше, и затем вызвать метод removeFileAtPath:. [fm removeFileAtPath: @"todolist" handler: nil];
Возвращаемый результат можно проверить, чтобы убедиться, что удаление этого файла выполнено успешно. if ([fm removeFileAtPath: @"todolistn handler: nil] == NO) { NSLog (@"Couldn’t remove file todolist"); (Нельзя удалить файл todolist) return 1; }
Словарь атрибутов позволяет, в частности, указывать разрешения доступа к создаваемому файлу или получать либо изменять информацию для существую-щего файла. Разрешения по умолчанию задаются при создании файла с указанием значения nil в качестве этого параметра. Метод fileAttributesAtPadiitraverseUnk: возвращает словарь, содержащий атрибуты указанного файла. Параметр traverseLink: имеет значение YES или N0 для символических ссылок. Если файл задан символической ссылкой и указано значение YES, то возвращаются атрибуты файла привязки; если указано значение N0, то возвращаются атрибуты самой привязки (ссылки).