企业信息

    北京沃赢科技有限公司

  • 12
  • 公司认证: 营业执照已认证
  • 企业性质:
    成立时间:
  • 公司地址: 北京市 海淀区 海淀街道 北京市海淀区银海大厦
  • 姓名: 刘老师
  • 认证: 手机未认证 身份证未认证 微信未绑定

    iOS中引用计数内存管理机制分析

  • 所属行业:商务服务 教育培训 管理培训
  • 发布日期:2015-08-19
  • 阅读量:250
  • 价格:面议
  • 产品规格:不限
  • 产品数量:10000.00 套
  • 包装说明:不限
  • 发货地址:北京海淀海淀  
  • 关键词:我赢职场,在线教育,iOS

    iOS中引用计数内存管理机制分析详细内容

    iOS中引用计数内存管理机制分析
    我赢职场课程学习:
    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序。
    ? ?操作系统的内存管理分成堆和栈。
    
    
    ? ?在堆中分配的内存,都试用引用计数模式;在栈中则不是。
    
    
    ? ?NSString 定义的对象是保存在栈中,所以它没有引用计算。看一些书上说它的引用计算会是 fffffffff 较大整数,测试的结果显示它是- 1. 对该对象进行 retain 操作,不好改变它的 retainCount 值。
    
    
    ? ?MutableNSString 定义的对象,需要先分配堆中的内存空间,再初始化才能使用。它是采用引用计数管理内存的。对该对象做 retainCount 操作则每次增加一个。
    
    
    ? ?其实,引用计数是对内存区域的空间管理方式,是应从内存块的视角去看的。任何对象都是指向它的指针,有多少个指针指向它,就有多少个引用计算。
    ? ?如果没有任何指针指向该内存块了,很明显,该内存块就没有对象引用了,引用计算就是 0, 系统会人为该内存区域已经空闲,于是立即清理,也就是更新一下管理堆的链表中某个标示位。
    
    
    测试方法如下:
    
    
    
    ? ???在 xcode 中建立一个非 arc 的项目,单视图即可。建立一个按钮的操作方法。
    
    
    ? ???- (IBAction)testRC:(id)sender {
    
    
    ? ???NSInteger i;
    ? ???i=self.i_test;
    
    
    ? ???if((i%2)==1)
    ? ???{
    ? ???NSString * str1=@"welcome";
    ? ???NSString * str2=@"mlgb";
    ? ???NSString * str3;
    ? ???NSString * str4=@"welcome";
    ? ???NSLog(@"str1 addr is %p",str1);
    ? ???NSLog(@"str2 addr is %p",str3);
    ? ???NSLog(@"str3 addr is %p",str3);
    ? ???NSLog(@"str4 addr is %p",str4);
    
    
    ? ???NSLog(@"str1 retainCount is %i",[str1 retainCount]);
    ? ???NSLog(@"str2 retainCount is %i",[str2 retainCount]);
    ? ???//NSLog(@"str3 retainCount is %i",[str3 retainCount]); 该使用会导致 crash ,因为 str3 没有指向任何内存区域。
    
    
    
    
    ? ???str3=[str1 retain];
    ? ???NSLog(@"str3=[str1 retain];");
    ? ???NSLog(@"str1 retainCount is %i",[str1 retainCount]);
    ? ???NSLog(@"str3 retainCount is %i",[str3 retainCount]);
    ? ???str3=[str2 retain];
    ? ???NSLog(@"str3=[str2 retain];");
    ? ???NSLog(@"str2 retainCount is %i",[str1 retainCount]);
    ? ???NSLog(@"str3 retainCount is %i",[str2 retainCount]);
    
    
    ? ???/*
    
    结果如下:
    ? ???2012-07-14 11:07:38.358 testMem[878:f803] str1 addr is 0x3540
    ? ???2012-07-14 11:07:38.360 testMem[878:f803] str2 addr is 0x0
    ? ???2012-07-14 11:07:38.361 testMem[878:f803] str3 addr is 0x0
    ? ???2012-07-14 11:07:38.362 testMem[878:f803] str4 addr is 0x3540
    
    
    ? ???在栈中,内容相同的对象 str1 和 str4 ,都分配在一个内存区域中,这点是 c 编译器的功能,有利于内存使用和效率。
    
    
    
    
    ? ???2012-07-14 11:07:38.363 testMem[878:f803] str1 retainCount is -1
    ? ???2012-07-14 11:07:38.364 testMem[878:f803] str2 retainCount is -1
    ? ???2012-07-14 11:07:38.365 testMem[878:f803] str3=[str1 retain];
    ? ???2012-07-14 11:07:38.366 testMem[878:f803] str1 retainCount is -1
    ? ???2012-07-14 11:07:38.367 testMem[878:f803] str3 retainCount is -1
    ? ???2012-07-14 11:07:38.367 testMem[878:f803] str3=[str2 retain];
    ? ???2012-07-14 11:07:38.368 testMem[878:f803] str2 retainCount is -1
    ? ???2012-07-14 11:07:38.369 testMem[878:f803] str3 retainCount is -1
    
    
    ? ???*/
    }
    else
    {
    
    
    
    
    ? ? NSMutableString * mstr1=[[NSMutableString alloc] initWithString:?@"welcome"?];
    
    NSMutableString?* mstr2=[[?NSMutableString?
    
    alloc?
    ]?
    initWithString?
    :?
    @"mlgb"?
    ];
    
    NSMutableString?* mstr3;
    
    NSMutableString?* mstr4=[[?NSMutableString?
    
    alloc?
    ]?
    initWithString?
    :?
    @"welcome"?
    ];
    
    
    ? ? NSLog(?@"mstr1 addr is %p"?,mstr1);
    ? ? NSLog(?@"mstr2 addr is %p"?,mstr2);
    ? ? NSLog(?@"mstr3 addr is %p"?,mstr3);
    ? ? NSLog(?@"mstr4 addr is %p"?,mstr4);
    
    
    ? ? NSLog(?@"mstr1 retainCount is %i"?,[mstr1 retainCount]);
    ? ? NSLog(?@"mstr2 retainCount is %i"?,[mstr2 retainCount]);
    
    //NSLog(@"mstr3 retainCount is %i",[mstr3 retainCount]);
    
    
    ? ? mstr3=[mstr1 retain];
    ? ? NSLog(?@"mstr3=[mstr1 retain];"?);
    
    
    ? ? NSLog(?@"mstr1 retainCount is %i"?,[mstr1 retainCount]);
    ? ? NSLog(?@"mstr3 retainCount is %i"?,[mstr3 retainCount]);
    ? ? NSLog(?@"mstr3 addr is %p"?,mstr3);
    
    
    ? ? mstr3=[mstr2 retain];
    ? ? NSLog(?@"mstr3=[mstr2 retain];"?);
    ? ? NSLog(?@"mstr2 retainCount is %i"?,[mstr1 retainCount]);
    ? ? NSLog(?@"mstr3 retainCount is %i"?,[mstr2 retainCount]);
    ? ? NSLog(?@"mstr3 addr is %p"?,mstr3);
    
    
    
    /*
    
    
    ? ???2012-07-14 11:07:36.652 testMem[878:f803] mstr1 addr is 0x68706b0
    ? ???2012-07-14 11:07:36.655 testMem[878:f803] mstr2 addr is 0x6876040
    ? ???2012-07-14 11:07:36.656 testMem[878:f803] mstr3 addr is 0x2a35
    ? ???2012-07-14 11:07:36.657 testMem[878:f803] mstr4 addr is 0x686fbf0
    
    
    ? ???2012-07-14 11:07:36.657 testMem[878:f803] mstr1 retainCount is 1
    ? ???2012-07-14 11:07:36.658 testMem[878:f803] mstr2 retainCount is 1
    
    
    ? ???2012-07-14 11:07:36.659 testMem[878:f803] mstr3=[mstr1 retain];
    
    
    ? ???2012-07-14 11:07:36.660 testMem[878:f803] mstr1 retainCount is 2
    ? ???2012-07-14 11:07:36.660 testMem[878:f803] mstr3 retainCount is 2
    
    
    ? ???2012-07-14 11:07:36.661 testMem[878:f803] mstr3 addr is 0x68706b0
    
    
    ? ???2012-07-14 11:07:36.662 testMem[878:f803] mstr3=[mstr2 retain];
    
    
    ? ???2012-07-14 11:07:36.663 testMem[878:f803] mstr2 retainCount is 2
    ? ???2012-07-14 11:07:36.663 testMem[878:f803] mstr3 retainCount is 2
    ? ???2012-07-14 11:07:36.664 testMem[878:f803] mstr3 addr is 0x6876040
    
    
    
    
    ? ???*/
    
    
    
    
    }
    
    
    self?.i_test=?self?.i_test+?1?;
    
    
    }
    
    做事情不忘初心才好
    
    
    
    简而言之,引用计数实际上是指向其内存区域的指针数,从内存块的角度去理解,就很*理解了。
    
    学习链接/ios/?tg=5009295340
    学习交流群:317140762
    
    

    http://jiexiaotan.cn.b2b168.com
    欢迎来到北京沃赢科技有限公司网站, 具体地址是北京市海淀区海淀街道北京市海淀区银海大厦,联系人是刘老师。 主要经营iOS开发、互联网架构师、安卓、Oracle、SAP、RedHat等。 单位注册资金未知。 我们公司主要服务有:教育教学软件等,我们愿以优质的服务和诚意、为您提供精良的产品和专业枝术,共创美好未来!