Я выучил 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];
}