NSString的内存存储

1、NSString内存的存储
平时在代码编程过程中,经常使用NSString对象,而且官网文档中要求NSString属性修饰词要使用copy,那么使用copy的原理是什么呢,不同数据的NSString内存储存又是什么样子的呢?
属性修饰词使用copy已在前面文章《copy与mutableCopy的区别》与《copy、strong、assign、weak修饰》讲过,此处就不在陈述,这里就重点讲一下NSString对象在内存中是怎么存储的。
这里先列举几种情况的代码,如图:
NSString *str = [NSString string];
NSString *str1 = [NSString string];

NSString *str2 = @"1";
NSString *str3 = @"3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333";

NSString *str4 = [NSString stringWithString:str1];
NSString *str5 = [NSString stringWithString:str2];
NSString *str6 = [NSString stringWithString:str3];

NSString *str7 = [NSString stringWithFormat:str1];
NSString *str8 = [NSString stringWithFormat:str2];
NSString *str9 = [NSString stringWithFormat:str3];

// 分别打印每个NSString对象的地址,对象指针地址,以及class:
NSLog(@"str = %p str地址 =%p, class = %@", str, &str, [str class]);
NSLog(@"str1 = %p str1地址 =%p, class = %@", str1, &str1, [str1 class]);
NSLog(@"str2 = %p str2地址 =%p, class = %@", str2, &str2, [str2 class]);
NSLog(@"str3 = %p str3地址 =%p, class = %@", str3, &str3, [str3 class]);
NSLog(@"str4 = %p str4地址 =%p, class = %@", str4, &str4, [str4 class]);
NSLog(@"str5 = %p str5地址 =%p, class = %@", str5, &str5, [str5 class]);
NSLog(@"str6 = %p str6地址 =%p, class = %@", str6, &str6, [str6 class]);
NSLog(@"str7 = %p str7地址 =%p, class = %@", str7, &str7, [str7 class]);
NSLog(@"str8 = %p str8地址 =%p, class = %@", str8, &str8, [str8 class]);
NSLog(@"str9 = %p str9地址 =%p, class = %@", str9, &str9, [str9 class]);
log输出
str = 0x7fff8c0061e8 str地址 =0x7ffeefbff458, class = __NSCFConstantString
str1 = 0x7fff8c0061e8 str1地址 =0x7ffeefbff450, class = __NSCFConstantString
str2 = 0x100008078 str2地址 =0x7ffeefbff448, class = __NSCFConstantString
str3 = 0x100008238 str3地址 =0x7ffeefbff440, class = __NSCFConstantString
str4 = 0x7fff8c0061e8 str4地址 =0x7ffeefbff438, class = __NSCFConstantString
str5 = 0x100008078 str5地址 =0x7ffeefbff430, class = __NSCFConstantString
str6 = 0x100008238 str6地址 =0x7ffeefbff428, class = __NSCFConstantString
str7 = 0x7fff8ba7ace0 str7地址 =0x7ffeefbff420, class = __NSCFConstantString
str8 = 0x371e8c598045a6e5 str8地址 =0x7ffeefbff418, class = NSTaggedPointerString
str9 = 0x103006760 str9地址 =0x7ffeefbff410, class = __NSCFString
通过log可以看出:
1、NSString对象通过【NSString string】函数生成的对象是同一块内存,该对象类型为__NSCFConstantString,内存存储在常量区;
2、不同长度的字符串生成

你可能感兴趣的:(NSString的内存存储)