首页 > 其他 > 详细

探讨NSString在哪个内存区

时间:2016-06-16 17:49:50      阅读:142      评论:0      收藏:0      [点我收藏+]
 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,不增加。
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:@"我来了"];//两种方式都一样。都在常量区

探讨NSString在哪个内存区

原文:http://www.cnblogs.com/billios/p/5591433.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!