iOS OC底层面试题(一个 NSObject 对象占用多少内存空间?)

一个 NSObject 对象占用多少内存空间?

受限于内存分配的机制,一个 NSObject对象都会分配 16byte 的内存空间。

但是实际上在 64位 下,只使用了 8byte;
在32位下,只使用了 4byte

一个 NSObject 实例对象成员变量所占的大小,实际上是 8 字节

#import <Objc/Runtime>
Class_getInstanceSize([NSObject Class])

本质是

size_t class_getInstanceSize(Class cls)
{
    if (!cls) return 0;
    return cls->alignedInstanceSize();
}

获取 Obj-C 指针所指向的内存的大小,实际上是16 字节

#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj); 

对象在分配内存空间时,会进行内存对齐,所以在 iOS 中,分配内存空间都是 16字节 的倍数。

可以通过以下网址 :openSource.apple.com/tarballs 来查看源代码。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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"); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值