我是新的目标c.试图找出NSString的类型在目标c.我使用sizeof()方法从c和lengththofbytesusingencoding方法使用UTF8编码从NSString。
NSString *test=@"a";
NSLog(@"LengthOfBytesUsingEncoding: %lu bytes", [test lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
printf("NSString: %lun", sizeof(test));
这会在控制台显示
LengthOfBytesUsingEncoding: 1 bytesandNSString: 8 bytes
两个结果有什么不同?为什么LengthOfBytesUsingEncoding返回1字节和sizeof方法返回8字节?NSString的类型是什么?Int, float, long, long double?
字节长度给出使用指定编码的文本内容的长度。在这种情况下,字符串包含一个字符,在UTF8中被编码为1字节。
sizeof
给出了变量类型的大小,在本例中是指向NSString
的指针。64位体系结构上所有指针的大小为8字节。它本质上是存储NSString
数据的内存地址的大小。sizeof
不是一个方法,甚至不是一个函数。它是一个算子。结果在编译时是已知的。
换句话说:
-
实际的字符串内容以不透明的格式存储在内存中,您不应该感兴趣。
-
在内存的另一个地方,有一个
NSString
数据结构,包含指向内容的指针。你可以使用sizeof(NSString)
来获得这个结构的大小(实际上大小取决于具体的NSString
子类,例如NSMutableString
,NSPlaceholderString
等)。 -
你的变量包含一个指向
NSString
的指针,也就是说,它的大小是sizeof(NSString*)
,它总是8字节。
sizeof
运算符在Objective-C中不应该引起你的兴趣,除非你在处理指针算术,这种情况应该是相当罕见的。