NSString字符串创建时的注意点
2017-09-05 本文已影响2人
FunkyRay
通过不同的方式创建字符串,字符串对象的存储位置不同
- 如果是通过字符串常量创建,那么字符串对象存储在常量区中
- 如果是通过
alloc initWithFormat/stringWithFormat
创建,那么字符串对象存储在堆区中
//1.通过字符串常量创建
//注意:如果是通过字符串常量创建对象,并且字符串常量的内容一致,那么如果创建多个字符串对象,多个对象指向同一块存储空间
NSString *str1 = @"lnj";
NSString *str12 = @"lnj";
//2.通过alloc init创建
//只要调用alloc就会在堆内存中开辟一块存储空间
NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
//3.通过类工厂方法创建/ stringWithFormat
//内部其实就是封装了alloc init
NSString *str3 = [NSString stringWithFormat:@"zs"];
NSString *str33= [NSString stringWithFormat:@"zs"];
注意点
- 不同的平台存储的方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就是两个对象
- 不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次
alloc
都会创建一个新的对象,如果是在Xcode6以上那么alloc
多次指向同一块存储空间 - 一般情况下,只要是通过
alloc
或者类工厂方法创建的对象,每次都会在堆内存中开辟一块新的存储空间;
但是如果是通过alloc
的initWithString
方法除外,因为这个方法是通过copy
返回一个浅拷贝的字符串对象给我们,所以不会产生一个新的对象
NSString *str4 = [[NSString alloc]initWithString:@"ls"];
NSString *str44 = [[NSString alloc]initWithString:@"ls"];