NSString的三种类型以及创建方式
NSString
一共有三种类型:
NSCFString
NSCFConstantString
NSTaggedPointerString
注意:必须先关闭ARC
NSString* str1 = @"hello";
NSString* _str1 = [NSString stringWithString:@"hello"];
NSString* str2 = [NSString stringWithFormat:@"hello"];
NSString* str3 = [NSString stringWithFormat:@"hello,world"];
NSString* str4 = [NSString stringWithFormat:@"abcdef"];
NSString* str5 = [NSString stringWithFormat:@"hello,world"];
NSString* str6 = [NSString stringWithFormat:@"哈哈哈"];
NSLog(@"str1 = %p %@ %lu", str1, [str1 class], [str1 retainCount]);
NSLog(@"_str1 = %p %@ %lu", _str1, [_str1 class], [_str1 retainCount]);
NSLog(@"str2 = %p %@ %lu", str2, [str2 class], [str2 retainCount]);
NSLog(@"str3 = %p %@ %lu", str3, [str3 class], [str3 retainCount]);
NSLog(@"str4 = %p %@ %lu", str4, [str4 class], [str4 retainCount]);
NSLog(@"str5 = %p %@ %lu", str5, [str5 class], [str5 retainCount]);
NSLog(@"str6 = %p %@ %lu", str6, [str6 class], [str6 retainCount]);
运行结果:
_NSCFConstantString
这个字符串可以通俗的理解为常量字符串,他是NSCFString的一个子类,表示不可变的常量字符串。通常使用@" "
和stringWithString
方法来生成这种类型。
由运行结果可以知道,该种字符串为了节省内存,每个相同的字符串只会储存一份,故而该种字符串当内容相同时,其对象的地址相同。这证明常量字符串是一种单例。
该种字符串储存在字符串常量区。
_NSCFString
和 __NSCFConstantString 不同, __NSCFString 对象是在运行时创建的一种 NSString 子类,他并不是一种字符串常量。所以和其他的对象一样在被创建时获得了 1 的引用计数。
- 由运行结果可以看到,_NSCFString对象被创建后获得了1的引用计数。
- 该种对象被储存在堆区中。
- 一般来说,使用
stringWithFormat
方法创建的NSString对象都是该种类型。
NSTaggedPointerString
NSTaggedPointerString 是 Objective-C 中 NSString 的一个特殊实现,用于表示小型字符串。
- NSTaggedPointerString 专门针对长度较短的字符串进行了优化。
- 它可以将小型字符串直接编码到指针本身,而无需分配单独的内存块。
- 对于NSString对象来说,当字符长度小于等于9时,同时字符都是ASCII码表内的字符,即会生成NSTaggedPointerString类型。当出现汉字会立即生成_NSCFString类型。