Работа с двоичными данными

Эта статья содержит примеры кода общих задач, применяющихся к и неизменным и непостоянным объектам данных, NSData и NSMutableData объекты. Из-за природы кластеров класса в Основе объекты данных не являются фактическими экземплярами NSData или NSMutableData классы, но вместо этого являются экземплярами одного из их частных подклассов. Несмотря на то, что класс объекта данных является частным, его интерфейс общедоступен, как объявлено этими абстрактными суперклассами, NSData и NSMutableData.

Создание объектов данных от необработанных байтов

Обычно Вы создаете объект данных из необработанных байтов с помощью одного из data... класс обменивается сообщениями любому NSData или NSMutableData объект класса. Эти методы возвращают объект данных, содержащий байты, которые Вы указываете.

Как правило, методы создания (такой как dataWithBytes:length:) сделайте копию байтов, которые Вы передаете как параметр. В этом случае, когда объект данных выпущен, скопированные байты принадлежат по условию объект и освобождены. Это - Ваша ответственность освободить исходные байты.

Однако, если Вы создаете NSData объект с одним из методов, имя которых включает NoCopy (такой как dataWithBytesNoCopy:length:), байты не копируются. Вместо этого объект данных берет владение байтов, передал в как параметр и освобождает их, когда выпущен объект. (NSMutableData реагирует на эти методы, также, но байты копируются так или иначе, и буфер сразу освобожден.) Поэтому байты Вы передаете NoCopy методы, должно быть, были выделены с помощью malloc.

Если Вы предпочитаете, чтобы байты не были скопированы или освобождены, когда объект выпущен, можно использовать dataWithBytesNoCopy:length:freeWhenDone: или initWithBytesNoCopy:length:freeWhenDone: передача методов NO как freeWhenDone: параметр.

Создание объектов данных от файлов или URLs

Вы используете dataWithContentsOfFile: или dataWithContentsOfURL: методы класса создать объект данных, содержащий содержание файла или URL. Следующий пример кода создает объект данных, myData, инициализированный с содержанием myFile.txt. Путь должен быть абсолютным.

NSString *thePath = @"/u/smith/myFile.txt";
NSData *myData = [NSData dataWithContentsOfFile:thePath];

Доступ и сравнение байтов

Два NSData примитивные методы —bytes и length— обеспечьте основание для всех других методов в классе. bytes метод возвращает указатель на байты, содержавшиеся в объекте данных. length метод возвращает число байтов, содержавшихся в объекте данных.

NSData обеспечивает методы доступа для копирования байтов от объекта данных в указанный буфер. getBytes:length: метод копирует байты в буфер. Например, следующий фрагмент кода инициализирует объект данных, myData, со строкой myString. Это тогда использует getBytes:length: скопировать содержание myData в aBuffer.

unsigned char aBuffer[20];
NSString *myString = @"Test string.";
const char *utfString = [myString UTF8String];
NSData *myData = [NSData dataWithBytes: utfString length: strlen(utfString)];
 
[myData getBytes:aBuffer length:20];

getBytes:range: метод копирует диапазон байтов от начальной точки в самих байтах.

Для извлечения объекта данных, содержащего подмножество байтов в другом объекте данных используйте subdataWithRange: метод. Например, следующий фрагмент кода инициализирует объект данных, data2, содержать поддиапазон data1:

NSString *myString = @"ABCDEFG";
const char *utfString = [myString UTF8String];
NSRange range = {2, 4};
NSData *data1, *data2;
 
data1 = [NSData dataWithBytes:utfString length:strlen(utfString)];
 
data2 = [data1 subdataWithRange:range];

Чтобы определить, равны ли два объекта данных, используйте isEqualToData: метод, делающий сравнение байта для байта.

Копирование объектов данных

Можно скопировать объекты данных создать копию только для чтения или создать непостоянную копию. NSData и NSMutableData примите NSCopying и NSMutableCopying протоколы, делая удобным преобразовать между эффективными, объектами данных только для чтения и непостоянными объектами данных. Вы используете copy создать копию только для чтения, и mutableCopy создать непостоянную копию.

Сохранение объектов данных

Можно сохранить объекты данных к локальному файлу или к Интернету. writeToFile:atomically: и writeToURL:atomically: методы позволяют Вам записать содержание объекта данных к локальному файлу.