探讨NSString在哪个内存区

 1     NSString *str = [[NSString alloc] initWithFormat:@"不可变"];//在堆区
 2     NSLog(@"p = %p; str = %ld",str, [str retainCount]);//
 3     
 4     self.retainStr  = str;// 浅拷贝。引用计数 +1
 5     NSLog(@"p = %p; self.retainStr = %ld",self.retainStr,[self.retainStr retainCount]);//
 6     self.copyStr    = str;// 浅拷贝。引用计数再 +1
 7     NSLog(@"p = %p; self.copyStr = %ld",self.copyStr,[self.copyStr retainCount]);
 8     
 9     self.retainMStr = [str mutableCopy];// 深拷贝。mutableCopy,引用计数 =1;retain,再 +1。
10     NSLog(@"p = %p; self.retainMStr = %ld",self.retainMStr,[self.retainMStr retainCount]);
11     self.copyMStr   = [str mutableCopy];// 深拷贝。mutableCopy,引用计数 =1;copy,又一次深拷贝,引用计数 = 1。
12     NSLog(@"p = %p; self.copyMStr = %ld",self.copyMStr,[self.copyMStr retainCount]);
13     
14     
15     
16     NSLog(@"-------------------------------");
17     
18     NSMutableString *mutableStr = [[NSMutableString alloc] initWithFormat:@"可变字符串"];//在堆区
19     NSLog(@"p = %p; mutableStr = %ld",mutableStr, [mutableStr retainCount]);//
20     
21     self.retainStr  = mutableStr;// 单纯地持有。所以,与mutableStr同地址。引用计数 +1
22     NSLog(@"p = %p; self.retainStr = %ld",self.retainStr, [self.retainStr retainCount]);//
23     self.copyStr    = mutableStr;// 深拷贝。与mutableStr不同地址,引用计数 =1
24     NSLog(@"p = %p; self.copyStr = %ld",self.copyStr, [self.copyStr retainCount]);
25     
26     self.retainMStr = mutableStr;// 单纯地持有。所以,与mutableStr同地址。引用计数再 +1
27     NSLog(@"p = %p; self.retainMStr = %ld",self.retainMStr, [self.retainMStr retainCount]);
28     self.copyMStr   = mutableStr;// 深拷贝。与mutableStr和self.copyStr的地址皆不同,引用计数 =1
29     NSLog(@"p = %p; self.copyMStr = %ld",self.copyMStr, [self.copyMStr retainCount]);
 1 2016-06-16 16:15:32.015 OCLession9[10611:174179] p = 0x100600960; str = 1
 2 2016-06-16 16:15:32.015 OCLession9[10611:174179] p = 0x100600960; self.retainStr = 2
 3 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x100600960; self.copyStr = 3
 4 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x100300350; self.retainMStr = 2
 5 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003003e0; self.copyMStr = 1
 6 2016-06-16 16:15:32.016 OCLession9[10611:174179] -------------------------------
 7 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003004b0; mutableStr = 1
 8 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003004b0; self.retainStr = 2
 9 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x100203ae0; self.copyStr = 1
10 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x1003004b0; self.retainMStr = 3
11 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x100203b10; self.copyMStr = 1

堆区:NSString *str = [[NSString alloc] initWithFormat:@"不可变"];//其中有汉字,是unicode,所以在堆区

常量区:NSString *str = [[NSString alloc] initWithFormat:@"123abc"];//纯在Ascll码,例如字母与数字的混合,编译器会在编译期用“悬垂指针”对其进行优化。可理解为在常量区。反正引用计数对此失效。

常量区:NSString *str = @"我来了";//[[NSString alloc] initWithString:@"我来了"];//两种方式都一样。都在常量区

原文地址:https://www.cnblogs.com/billios/p/5591433.html