Как использовать assign вместо memcpy - PullRequest
1 голос
/ 22 апреля 2020

Я выучил memcpy здесь

Демонстрация показывает memcpy очень похоже на assign


Как использовать assign вместо memcpy

- (uint64_t)parseHeader:(NSData *)data {

    uint64_t headerLength = 0;
    memcpy(&headerLength, data.bytes, sizeof(uint64_t));
 // set a breakpoint
    return headerLength;
}

Я полагаю, что headerLength должно равняться (uint64_t)(data.bytes)

И I p в этой точке останова

вот результат:

(lldb) p headerLength
(uint64_t) $0 = 318
(lldb) p data.bytes
(const void *) $1 = 0x00006000000050e0
(lldb) p (uint64_t)(data.bytes)
(uint64_t) $2 = 105553116287200

Так как же понять memcpy в этом контексте?

Я хочу использовать больше OOP, чтобы избавиться от memcpy


Подробнее код:

Я сталкиваюсь с этим при изучении GCDAsyncSocket

Выше часть получения данных.

Часть отправки данных:

typedef NS_ENUM(NSInteger, PacketType){
    PacketTypeUnknown = -1,
    PacketTypeDidAddDisc,
    PacketTypeStartNewGame
};



typedef NS_ENUM(NSInteger, PacketAction){
    PacketActionUnknown = -1
};

@interface PacketH: NSObject<NSSecureCoding>

@property (strong, nonatomic) id data;
@property (assign, nonatomic) PacketType type;
@property (assign, nonatomic) PacketAction action;


@end



- (void)sendPacket:(PacketH *)packet {

    // Encode Packet Data
    NSError * error;
    NSData * encoded = [NSKeyedArchiver archivedDataWithRootObject:packet requiringSecureCoding:NO error: &error];
    // Initialize Buffer
    NSMutableData *buffer = [[NSMutableData alloc] init];

    // buffer = header + packet

    // Fill Buffer

    uint64_t headerLength = encoded.length;
    [buffer appendBytes:&headerLength length:sizeof(uint64_t)];
    [buffer appendBytes: encoded.bytes length: headerLength];

    // Write Buffer
    [self.socket writeData:buffer withTimeout:-1.0 tag:0];
}

1 Ответ

1 голос
/ 22 апреля 2020

Спасибо @ user3386109,

getBytes:length: метод NSData, очень похоже на memcpy

- (uint64_t)parseHeader:(NSData *)data {
    NSInteger headerLength = 0;
    [data getBytes: &headerLength length:sizeof(uint64_t)];
    return headerLength;
}
...