正常情况下,创建一个OC对象,即引用类型的变量,都会在堆中申请一块内存空间。
但是NSString 是一个例外,编译器对字符串进行了优化。
1.通过字面量创建的字符串是存储在常量区的,而不是堆区。
2.值相等的两个字符串占用同一份内存。

通过事例我们可以看出,str1和str2占用同一份内存。str3和str5占用一份内存。
其中str1和str2使用字面量进行创建,并且值相等,故存储在常量区,占用一份内存。
而str3通过Format方式创建的字符串,是占用堆内存的。这时再通过字面量创建str4,并让其值与str3相同,我们发现内存地址不同了,因为一个在常量区,一个在堆区。
再来比较str3与str5,经过测试,图中str5的两种创建方式,内存地址都与str3相同。可得出结论,使用Format创建的字符串存储在堆区,堆区中的字符串值如果相等,也是同样占用一份内存。
总结
1.通过字面量,或者initWithString这两种方式创建的字符串都是属于字符串常量,存储在常量区,常量区中的字符串常量如果值相等,那么占用同一份内存。
2.通过Fromat创建的字符串,是存储在堆中的,同处堆中的字符串,如果值相等,也是占用同一份内存的。
网友评论