Как написать NSArray для NSOutputStream? - PullRequest
1 голос
/ 03 апреля 2009

Я хочу отправить NSArray, поэтому мне нужно сначала записать его в NSOutputStream. Метод должен быть:

- (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)length

Я могу преобразовать указатель массива в uint8 _ t, используя:

(uint8_t *)arr

Но как получить длину байтов массива? Нужно ли сохранять массив в файл и читать его как NSData?

1 Ответ

2 голосов
/ 03 апреля 2009

Я могу преобразовать указатель массива в uint8 _ t, используя:

(uint8_t *)arr

Это просто актерский состав; фактически он не конвертирует массив в последовательность байтов. Даже если вы отправили частное хранилище массива по проводам, содержимое массива - это просто адреса памяти других объектов. Адреса памяти в вашем процессе почти наверняка не совпадают в процессе получения - и это предполагает, что процесс получения выполняет Какао и будет ожидать NSArray!

Вам необходимо сериализовать содержимое массива в какое-то внешнее представление, которое получатель сможет обработать. Вы можете сделать это путем преобразования в plist , создания NSXMLDocument и , получения его данных или сборки представления в произвольном формате вручную, но не с помощью брошен один.

Но как узнать длину байтов массива?

Массив не является серией байтов; это объект. Как таковой, он не имеет длины, только (как массив) количество объектов в нем. Вам нужна серия байтов, прежде чем вы сможете получить длину серии.

Нужно ли сохранять массив в файл и считывать его как NSData?

Вам необходимо получить внешнее представление массива, предпочтительно в объекте NSData. Сказать, что он сам записал (список) в файл, и прочитать файл обратно одним способом, но есть гораздо лучшие способы, которые я перечислил выше.

...