oc struct

oc中结构的对齐规则和vc不太一样。

比如:

typedef struct testStruct{

    NSString *testStr1;

}TEST_STRUCT;

打印sizeof(TEST_STRUCT):结果是4

typedef struct testStruct{

    NSString *testStr1;

    double testdub;

}TEST_STRUCT;

打印sizeof(TEST_STRUCT):结果是12

typedef struct testStruct{

    NSString *testStr1;

    double testdub;

    char testChr;

    NSString *testStr2;

}TEST_STRUCT;

打印sizeof(TEST_STRUCT):结果是20

typedef struct testStruct{

    NSString *testStr1;

    double testdub;

    char testChr;

    short testSht;

    NSString *testStr2;

}TEST_STRUCT;

打印sizeof(TEST_STRUCT):结果是20

注意点:

1.testStr1是指针,4个字节,指针地址是0。第二个参数是doublue型,8个字节,但并没有像oc那样指针地址从8开始,而是从4开始。开始的地址并不需要是当前参数所需内存字节的倍数。

2.

char testChr;

short testSht;公用一个4字节。

3.double型字节数是8,但是整个结构的字节数并不是8的倍数,也不同于VC

结论:oc下结构,以4字节为界限,当参数类型超过4字节(比如double)时,会填满之前的4字节再开始填入内存。当参数类型少于4字节(charshort)时,规则相同于VC——即填满参数类型需要字节数的倍数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 iOS 中,可以使用 MulticastSocket 实现组播功能。下面是一个基本的示例代码: ```objective-c #import <UIKit/UIKit.h> #import <arpa/inet.h> #import <sys/socket.h> @interface MulticastSocket : NSObject @property (nonatomic, assign) int socketDescriptor; @property (nonatomic, assign) struct sockaddr_in multicastAddr; - (BOOL)joinMulticastGroup:(NSString *)multicastGroup onInterface:(NSString *)networkInterface; - (BOOL)leaveMulticastGroup:(NSString *)multicastGroup onInterface:(NSString *)networkInterface; - (BOOL)sendData:(NSData *)data toMulticastGroup:(NSString *)multicastGroup onPort:(int)port; @end @implementation MulticastSocket - (BOOL)joinMulticastGroup:(NSString *)multicastGroup onInterface:(NSString *)networkInterface { // 创建 socket self.socketDescriptor = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (self.socketDescriptor < 0) { NSLog(@"Failed to create socket"); return NO; } // 设置 socket 选项 int reuse = 1; if (setsockopt(self.socketDescriptor, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) { NSLog(@"Failed to set socket options"); return NO; } // 绑定 socket struct sockaddr_in localAddr; memset((char *)&localAddr, 0, sizeof(localAddr)); localAddr.sin_family = AF_INET; localAddr.sin_port = htons(0); localAddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(self.socketDescriptor, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { NSLog(@"Failed to bind socket"); return NO; } // 设置组播地址 memset((char *)&self.multicastAddr, 0, sizeof(self.multicastAddr)); self.multicastAddr.sin_family = AF_INET; self.multicastAddr.sin_port = htons(12345); if (inet_aton([multicastGroup UTF8String], &self.multicastAddr.sin_addr) == 0) { NSLog(@"Invalid multicast address"); return NO; } // 加入组播组 struct ip_mreq mreq; memset((char *)&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = self.multicastAddr.sin_addr.s_addr; mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(self.socketDescriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) { NSLog(@"Failed to join multicast group"); return NO; } return YES; } - (BOOL)leaveMulticastGroup:(NSString *)multicastGroup onInterface:(NSString *)networkInterface { // 离开组播组 struct ip_mreq mreq; memset((char *)&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = self.multicastAddr.sin_addr.s_addr; mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(self.socketDescriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) { NSLog(@"Failed to leave multicast group"); return NO; } // 关闭 socket if (close(self.socketDescriptor) < 0) { NSLog(@"Failed to close socket"); return NO; } return YES; } - (BOOL)sendData:(NSData *)data toMulticastGroup:(NSString *)multicastGroup onPort:(int)port { // 发送数据到组播组 struct sockaddr_in destAddr; memset((char *)&destAddr, 0, sizeof(destAddr)); destAddr.sin_family = AF_INET; destAddr.sin_port = htons(port); if (inet_aton([multicastGroup UTF8String], &destAddr.sin_addr) == 0) { NSLog(@"Invalid multicast address"); return NO; } if (sendto(self.socketDescriptor, [data bytes], [data length], 0, (struct sockaddr *)&destAddr, sizeof(destAddr)) < 0) { NSLog(@"Failed to send data"); return NO; } return YES; } @end ``` 使用示例: ```objective-c // 创建组播 socket MulticastSocket *socket = [[MulticastSocket alloc] init]; if (![socket joinMulticastGroup:@"224.0.0.1" onInterface:nil]) { NSLog(@"Failed to join multicast group"); return; } // 发送数据到组播组 NSString *message = @"Hello, multicast!"; NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; if (![socket sendData:data toMulticastGroup:@"224.0.0.1" onPort:12345]) { NSLog(@"Failed to send data"); } // 离开组播组 if (![socket leaveMulticastGroup:@"224.0.0.1" onInterface:nil]) { NSLog(@"Failed to leave multicast group"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值