深入理解NSString的三种类型
2023-09-14 08:27:20
前言
在iOS开发中,NSString是开发者们使用频率极高的一个类,它主要用于存储和操作字符串。NSString是Foundation框架中的一个类,提供了一系列强大的字符串处理方法。
为了更好地理解NSString的用法,我们需要首先了解NSString的三种类型:tagged pointer、__和__CFString.这三种类型分别代表了三种不同的字符串存储方式,每种方式都有各自的优缺点。
NSString的三种类型
1. Tagged Pointer
Tagged pointer是NSString中最常见的一种类型,也是默认的类型。Tagged pointer本质上是一个指针,它指向一个字符串的存储位置。Tagged pointer的优点在于它非常高效,因为它只需要存储一个指针,而不是整个字符串。这使得tagged pointer非常适合存储短字符串,或者是在字符串经常被改变的情况下。
然而,Tagged pointer也有一个缺点,那就是它不能存储空字符串。当我们创建一个空字符串时,系统会自动将其转换成一个__CFString__.
2. NSConstantString
NSConstantString是一种只读字符串,它存储在一个常量池中。这意味着它不能被修改,也不会被释放。NSConstantString的优点在于它非常高效,因为它不需要进行内存管理。而且,由于它是只读的,因此它是线程安全的。
NSConstantString的缺点在于它不能存储可变字符串。当我们创建一个可变字符串时,系统会自动将其转换成一个__NSMutableString__.
3. CFString
CFString是Core Foundation框架中的一个字符串类。它与NSString非常相似,但它有更多的特性。CFString的优点在于它可以存储空字符串,而且它可以存储可变字符串。此外,CFString还支持更高级别的字符串操作,如正则表达式匹配。
CFString的缺点在于它比NSString更慢。这是因为CFString需要进行内存管理,而NSString则不需要。
总结
NSString的三种类型各有优缺点。Tagged pointer非常高效,但它不能存储空字符串。NSConstantString也是非常高效,但它不能存储可变字符串。CFString可以存储空字符串和可变字符串,但它比NSString更慢。
在选择NSString的类型时,我们需要考虑字符串的长度、是否需要修改字符串以及字符串是否需要支持高级操作。如果字符串很短,而且不需要修改,那么tagged pointer是一个不错的选择。如果字符串很长,或者需要修改,那么CFString是一个不错的选择。
参考资料
问题发现:
创建四个字符串
一、三直接赋值,二、四通过stringWithFormat进行赋值
一、二
NSString *str1 = @"hello world";
NSString *str2 = [NSString stringWithFormat:@"hello world"];
NSLog(@"str1 == str2: %d", str1 == str2);
输出结果:
str1 == str2: 1
三、四
NSString *str3 = @"hello";
NSString *str4 = [NSString stringWithFormat:@"hello"];
NSLog(@"str3 == str4: %d", str3 == str4);
输出结果:
str3 == str4: 0
问题分析:
从上面的实验结果可以看出,当我们直接给字符串赋值时,两个字符串指向的地址是相同的,即str1和str2指向同一个字符串对象。这是因为系统会自动将字符串常量存储在常量池中,当我们使用相同的字符串常量时,系统会直接从常量池中取出来使用,而不是重新创建新的字符串对象。
但是,当我们使用stringWithFormat方法来创建字符串时,情况就不同了。stringWithFormat方法会创建一个新的字符串对象,因此str3和str4指向不同的字符串对象。
结论:
在iOS开发中,如果我们使用相同的字符串常量,那么系统会自动将它们存储在常量池中,当我们使用这些字符串常量时,系统会直接从常量池中取出来使用,而不是重新创建新的字符串对象。但是,如果我们使用stringWithFormat方法来创建字符串,那么系统会创建一个新的字符串对象。