zoukankan      html  css  js  c++  java
  • 探讨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:@"我来了"];//两种方式都一样。都在常量区

  • 相关阅读:
    CAS实战の自定义注销
    CAS实战の自定义登录
    MongoDB学习总结
    Django登录使用的技术和组件
    Docker搭建Hadoop环境
    配置Nginx的坑及思路
    Centos7 升级 sqlite3
    Python基础题
    pandas的数据筛选之isin和str.contains函数
    CentOS7 下Docker最新入门教程 超级详细 (安装以及简单的使用)
  • 原文地址:https://www.cnblogs.com/billios/p/5591433.html
Copyright © 2011-2022 走看看