Шрифт:
Используя класс Fraction, определенный в части I, создайте мутабельный мас-сив дробей (fraction) с произвольными значениями. Затем отсортируйте этот массив с помощью метода sortUsingSelector: из класса NSMutableArray. Добавьте в класс Fraction категорию Comparison (сравнение) и реализуйте свой метод сравнения в этой категории.
Определите три новых класса с именами Song, PlayList и MusicCollection. Объект класса Song должен содержать информацию об определенной песне, например, ее название (title), исполнителя (artist), альбом (album) и время воспроизведения (playing time). Объект класса PlayList должен содержать имя списка воспроизведения и коллекцию песен. Объект класса MusicCollection должен содержать коллекцию списков воспроизведения, включая специальный мастер-список с именем library (библиотека), который содержит все песни этой коллекции. Определите эти три класса и напишите методы, чтобы выполнять следующее.
Создавать объект класса 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, если операцию не удалось выполнить. В этой главе не товорится о том, как писать хендлеры.