Во-первых, NSNumber * numero - «Указатель на тип NSNumber», а тип NSNumber - объект Objective-C. В общем случае, если конкретно не указано где-то в документации, эмпирическое правило в объектно-ориентированном программировании заключается в том, что «Внутренние детали того, как объект выбирает представление своего внутреннего состояния, являются частными для реализации объектов и должны рассматриваться как черные ящик «. Опять же, если в документации не указано, что вы можете сделать иначе, вы не можете предположить, что NSNumber использует примитивный тип C int
для хранения значения int
, которое вы ему дали.
Ниже грубое приближение того, что происходит «за кулисами», когда вы appendBytes:numero
:
typedef struct {
Class isa;
double dbl;
long long ll;
} NSNumber;
NSNumber *numero = malloc(sizeof(NSNumber));
memset(numero, 0, sizeof(NSNumber));
numero->isa = objc_getClass("NSNumber");
void *bytes = malloc(1024);
memcpy(bytes, numero, sizeof(numero)); // sizeof(numero) == sizeof(void *)
Это делает его немного более ясно, что вы добавления к NSMutableData
объекта data
является первые четыре байта того, что указывает numero
(что для объекта в Obj-C всегда isa
, класс объектов). Я подозреваю, что вам нужно было скопировать указатель на экземпляр объекта (значение numero), и в этом случае вы должны были использовать &numero
. Это проблема, если вы используете GC, поскольку буфер, используемый NSMutableData
, не сканируется (то есть система GC больше не «видит» объект и не восстанавливает его, что в значительной степени является гарантией случайного сбоя в некоторых более поздних версиях точка.)
Надеюсь, что даже если вы поместите указатель на экземпляр объекта NSNumber
в data
, этот указатель имеет смысл только в контексте процесса, который его создал. Указатель на этот объект еще менее значим, если вы отправляете этот указатель на другой компьютер - принимающий компьютер не имеет (практического, тривиального) способа чтения памяти, на которую указывает указатель на отправляющем компьютере.
Поскольку вы, кажется, возникли проблемы с этой частью процесса, позвольте мне дать рекомендацию, что поможет вам сэкономить много времени, отладки некоторых очень сложных ошибок реализации вы обязаны работать, чтобы:
Abandon вся эта идея попытаться отправить необработанные двоичные данные между машинами и просто отправить между ними форматированную информацию ASCII/UTF-8.
Если вы считаете, что некоторые из них будут медленными или неэффективными, позвольте мне порекомендовать вам сначала принести все, используя упрощенную версию ASCII/UTF-8. Поверьте мне, отладка сырых двоичных данных не является забавой, и способность просто NSLog(@"I got: %@", dataString)
стоит своего веса в золоте, когда вы отлаживаете свои неизбежные проблемы. Затем, как только все заглохло, и вы уверены, что вам не нужно делать какие-либо изменения в том, что вам нужно обменивать, «порт» (из-за отсутствия лучшего слова), что реализация в двоичную только версию если, и только если, профилирование с помощью Shark.app идентифицирует его как проблемную область. В качестве отправной точки в эти дни я могу загрузить файл между машинами и насытить гигабитную ссылку с передачей. scp
, вероятно, приходится делать в пять тысяч раз больше обработки на байт, чтобы сжать и зашифровать данные, чем эта простая строчка, при передаче 80 МБ/сек. Тем не менее, на современном оборудовании это едва достаточно, чтобы сдвинуть счетчик процессора, который работает в моей строке меню.
я все еще получаю ошибку: «предупреждение: проходя аргумент 1 из„appendBytes: длина:“делает указатель из целого числа без броска» –
Это последняя строка должна быть: [appendBytes данные: & networkInteger SizeOf (networkInteger)] ; Обратите внимание на «&». –
Это было ... спасибо. С одной стороны, я просто хотел указать, что в документации Apple говорится, что перед sizeof() будет помещаться «length:». Это часть имени метода. Полный пример в их документации идет примерно так: - (void) appendBytes: (const void *) длина байтов: (NSUInteger) длина Я не хотел ничего говорить, но когда два человека этого не видели, я подумал, что должен упомянуть об этом. –