`
mikixiyou
  • 浏览: 1101026 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353798
社区版块
存档分类
最新评论

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

    博客分类:
  • iOS
阅读更多


    iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序。

   操作系统的内存管理分成堆和栈。


   在堆中分配的内存,都试用引用计数模式;在栈中则不是。


   NSString 定义的对象是保存在栈中,所以它没有引用计算。看一些书上说它的引用计算会是 fffffffff 最大整数,测试的结果显示它是- 1. 对该对象进行 retain 操作,不好改变它的 retainCount 值。


   MutableNSString 定义的对象,需要先分配堆中的内存空间,再初始化才能使用。它是采用引用计数管理内存的。对该对象做 retainCount 操作则每次增加一个。


   其实,引用计数是对内存区域的空间管理方式,是应从内存块的视角去看的。任何对象都是指向它的指针,有多少个指针指向它,就有多少个引用计算。

   如果没有任何指针指向该内存块了,很明显,该内存块就没有对象引用了,引用计算就是 0, 系统会人为该内存区域已经空闲,于是立即清理,也就是更新一下管理堆的链表中某个标示位。



(miki西游 @mikixiyou 原文 链接: http://mikixiyou.iteye.com/blog/1592958 )


     测试方法如下:


     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 ;


}



简而言之,引用计数实际上是指向其内存区域的指针数,从内存块的角度去理解,就很容易理解了。


0
0
分享到:
评论

相关推荐

    ios5之自动引用计数

    在iOS5中,苹果引入了一项重大的内存管理改进——自动引用计数(Automatic Reference Counting,简称ARC)。这项技术简化了开发者对内存管理的需求,使得他们能够更加专注于应用程序的核心逻辑而非繁琐的内存释放...

    iOS 内存管理机制 详细解读

    Objective-C的ARC(Automatic Reference Counting)机制自动处理对象的引用计数,减少了内存管理的负担。 5.5.1)ARC介绍 ARC是在编译时插入适当内存管理代码的机制,确保对象的引用计数正确。 5.5.2)所有权修饰...

    庄延军《iOS内存管理及优化》

    它旨在帮助读者深入理解iOS内存管理机制,掌握内存优化方法,从而提升应用性能、稳定性和用户体验。 内存管理是移动应用开发中一个非常重要的方面。在iOS开发中,应用程序的内存使用情况会直接影响到应用的运行效率...

    ios之内存管理

    这个原则源于Objective-C中的引用计数内存管理机制,即ARC(Automatic Reference Counting)。在iOS中,对象的生命周期依赖于其他对象对其的引用。当一个对象被创建时,它的引用计数为1,每增加一个强引用,引用计数...

    Objective-C 内存管理机制 - iOS知识库1

    Objective-C 是 iOS 开发中的主要编程语言,其内存管理机制对于优化应用性能和防止内存泄漏至关重要。内存管理主要关注如何有效地分配和释放内存,确保程序的稳定运行。 1. **值类型与引用类型:** - **值类型**...

    iOS高级内存管理ARC模式手动模式英文文档含示例工程

    ARC(Automatic Reference Counting)是苹果引入的一种智能内存管理机制,它自动处理对象的引用计数,大大减轻了开发者手动释放内存的工作。然而,尽管ARC在大多数情况下能够很好地工作,但在某些高级场景下,理解并...

    ios memory 内存管理

    苹果公司提供的Memory Management Programming Guide是一份详尽的指南,它深入解析了iOS系统中的内存管理机制,为开发者提供了宝贵的资源,帮助他们构建性能更佳、资源利用更高效的应用程序。 ### iOS内存管理的...

    Swift 语言的内存管理机制解析

    这是一种编译器自动实现的内存管理机制,它通过跟踪对象的引用计数来自动管理内存。当一个对象的引用计数降至零时,ARC 会自动释放该对象占用的内存,从而避免内存泄漏和过度分配。 Swift 的内存管理机制通过 ARC 为...

    ios内存管理之深浅拷贝

    这些概念对于理解Objective-C中的内存管理机制至关重要。 首先,我们需要了解iOS内存管理的基本原则,即引用计数(Reference Counting)。每个Objective-C对象都有一个引用计数,记录了有多少个指针指向它。当对象...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    ARC则是苹果引入的一种智能内存管理机制,它在编译时自动插入必要的引用计数操作,减少了程序员手动管理内存的负担。理解并熟练掌握这两者,能有效避免常见的内存泄漏问题。 多线程技术则让应用可以在同一时间执行...

    IOS高级内存管理编程指南.pdf

    iOS高级内存管理编程指南主要介绍了iOS环境下对象的内存管理机制,尤其在Objective-C编程语言中的内存管理方式。在iOS应用开发中,内存管理对于保证应用的稳定运行至关重要。本文将详细介绍iOS内存管理的知识点,...

    IOS IPhone 内存管理

    IOS IPhone 内存管理 IOS IPhone 内存管理是指在 ...IOS IPhone 内存管理机制需要开发者手动管理内存,使用 retain 和 release 机制来避免无效指针,遵守一些规则以使用 autorelease pool,以避免内存泄露和崩溃。

    iOS内存管理中引用计数的学习

    本文主要讨论的是iOS内存管理中的引用计数机制,这是Objective-C和Swift(早期版本)中的一种自动内存管理策略。 引用计数是一种跟踪和管理对象生命周期的方法。简单来说,一个对象的引用计数表示了有多少个指针...

    iOS block实现,内存管理

    Block是Objective-C中的一种强大的特性,它允许我们将代码块封装为可传递的对象。在iOS和OS X开发中,Block常用于异步操作的回调、...理解Block的实现原理和内存管理机制,对于编写高效、安全的iOS和OS X应用至关重要。

    IOS内存管理与软件调试

    iOS系统采用自动引用计数(Automatic Reference Counting, ARC)作为主要的内存管理机制。ARC负责跟踪对象的所有者,并在适当的时候释放不再使用的内存。理解如何正确使用ARC至关重要,因为它可以避免内存泄漏和过早...

    UnityAndroid/iOS查看真机内存使用情况插件

    2. **Android和iOS内存管理**:Android和iOS操作系统都有自己的内存管理机制。Android使用Dalvik或ART虚拟机进行内存分配和回收,而iOS则依赖于Objective-C/Swift的自动引用计数(Automatic Reference Counting, ARC)...

    iOS 的多核编程和内存管理

    在Objective-C中,内存管理主要是通过引用计数(Retain Count)来实现的。当一个对象被创建时,它的引用计数为1;每次使用`retain`方法增加其引用计数,使用`release`方法减少引用计数。当引用计数为0时,该对象会被...

    iOS内存泄漏调试工程

    1. **内存管理机制**: iOS采用自动引用计数(ARC)来管理内存,当一个对象的引用计数变为0时,系统会自动释放该对象。然而,如果存在循环引用或者意外的强引用,就会导致内存泄漏。 2. **循环引用**: 循环引用...

    iOS内存泄漏检测器

    在iOS中,自动引用计数(ARC,Automatic Reference Counting)是一种自动管理对象生命周期的机制,它负责跟踪和释放不再使用的对象。然而,尽管ARC极大地简化了内存管理,但仍然可能存在内存泄漏,尤其是由于循环...

    深入剖析 Swift 中的自动引用计数(ARC)机制

    Swift 的 ARC 机制通过自动引用计数提供了一种高效且安全的内存管理方式。理解 ARC 的工作原理和正确使用强引用、弱引用和无主引用对于编写高效、稳定且可靠的 Swift 程序至关重要。通过避免循环引用和正确管理闭包...

Global site tag (gtag.js) - Google Analytics