ios - NSString 是什么类型,有多少字节?
问题描述
我是目标 c 的新手。试图找出目标 C 中 NSString 的类型。我使用 C 中的 sizeof() 方法和使用 NSString 中的 UTF8 编码的 lengthOfBytesUsingEncoding 方法。
NSString *test=@"a";
NSLog(@"LengthOfBytesUsingEncoding: %lu bytes", [test lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
printf("NSString: %lu\n", sizeof(test));
这将在控制台中给我
LengthOfBytesUsingEncoding:1 个字节 和NSString:8 个字节
这两个结果有什么区别?为什么 LengthOfBytesUsingEncoding 返回 1 个字节而 sizeof 方法返回 8 个字节?NSString 的类型是什么?整数、浮点数、长整数、长整数?
解决方案
字节长度为您提供使用指定编码的文本内容的长度。在这种情况下,字符串包含一个字符,在 UTF8 中被编码为 1 个字节。
为您提供变量类型的sizeof
大小,在本例中是指向NSString
. 64 位架构上所有指针的大小为 8 字节。它本质上NSString
是存储数据的内存地址的大小。sizeof
不是方法,甚至不是函数。是运营商。结果在编译时是已知的。
换句话说:
实际的字符串内容以不透明且您不应该感兴趣的格式存储在内存中。
在内存的另一个地方,有
NSString
一个包含指向内容的指针的数据结构。sizeof(NSString)
您可以使用(实际上大小会因具体NSString
子类而异,例如NSMutableString
等NSPlaceholderString
)获得此结构的大小。您的变量包含一个指向 的指针
NSString
,即它的大小为sizeof(NSString*)
,始终为 8 个字节。
sizeof
运算符不应该让您对 Objective-C 感兴趣,除非您正在处理指针算术,这应该是相当罕见的。
推荐阅读
- reactjs - React - 从 setSate 改变状态参数
- sql - 当发生更改时,将数据从单个时间戳建模到具有 valid_from/valid_to 时间戳的记录
- php - 当我从另一个 laravel 应用程序调用控制器上的更新方法时插入了错误的时间戳
- java - 从android中的背景启动活动或全屏意图
- geojson - 如何将 Laravel DB 连接中的数据转换为 GeoJSON
- openvpn - 网络管理器 openvpn 仅在 ssh 连接后解析一次
- c# - 文件不会在 asp.net core 中转换图像格式
- amazon-ecs - 从 VPC 内创建的 ECS-fargate 任务调用 AWS 服务 [s3、DynamoDB、kinsesis]
- c# - C# - 来自 SecureString 的字节数组
- here-api - 在 https://route.api.here.com/routing/7.2/calculateroute.json 中设置出发日期时间不起作用?