美文网首页iOS
iOS 引用计数理解

iOS 引用计数理解

作者: 淡定的笨鸟 | 来源:发表于2019-05-08 13:52 被阅读17次

最近在研究内存管理,所以看了很多runtime底层的代码,越深入探索越觉得自己在理解上还是出现了部分偏差,现在重新整理记录一下,以防自己忘了。

引用计数

在iOS中,用引用计数来管理内存,在创建一个对象时,首先在内存中开辟一块内存空间,引用计数变为1,告诉系统这块内存不能释放,在有指针指向这个对象时,引用计数+1,当这个指向对象的指针变成nil时,对象引用计数-1,当引用计数为0时销毁这块内存,说白了引用计数就是指一块内存地址上有几个指针(指向)。下面举例来看一下。

    NSObject *obj1 = [NSObject new];
    NSObject *obj2 = obj1;
    __weak NSObject *obj3 = obj1;
    NSObject *obj4 = obj1;
    NSObject *obj5 = obj3;
    printf("obj1:%ld\n", CFGetRetainCount((__bridge CFTypeRef)(obj1)));
    printf("obj2:%ld\n", CFGetRetainCount((__bridge CFTypeRef)(obj2)));
    printf("obj3:%ld\n", CFGetRetainCount((__bridge CFTypeRef)(obj3)));
    printf("obj4:%ld\n", CFGetRetainCount((__bridge CFTypeRef)(obj4)));
    printf("obj5:%ld\n", CFGetRetainCount((__bridge CFTypeRef)(obj5)));

我们分三步来解析这段代码

  • 从控制栏左侧我们可以看出,obj1、obj2、obj3的内存地址(0x6xxxx),0x6开头的是堆内存地址,它们三个享有共同的内存地址。
  • 再看右侧控制栏,我们分别打印一下它们的指针地址,发现它们虽然内存地址一样,但是指针地址是不一样的,指针地址指向同一块内存。
  • 最后看一下它们的引用计数,引用计数就是在数这个内存地址上有几个指针在指向。如下图所示


1、obj1指向了内存,内存现在有一个指针,retainCount = 1
2、obj2强引用了obj1,所以也指向了内存,retainCount+1
3、obj3弱引用了obj1,在obj3看来“我就是指向了内存”,但在其他人看来他没有指向内存,所以其他人retainCount不变,obj3的retainCount+1。
4、obj4强引用了obj1,所以也指向了内存,retainCount+1
5、obj5强引用了obj3,而obj3指向内存,所以obj5也指向内存,retainCount+1
综上,在obj1、obj2、obj4、obj5看来,这块内存有4个指针即retainCount=4,在obj3看来,自己也算是指向内存了,所以obj3的retainCount=5。

相关文章

  • iOS内存管理初探 – 引用计数、AutoRelease与ARC

    引用计数式内存管理 引用计数 iOS通过引用计数管理对象的生命周期,每个对象有其引用计数。 对象被强引用时引用计数...

  • 内存管理面试题

    讲一下 iOS 内存管理的理解 在iOS中,使用引用计数来管理OC对象的内存 一个新创建的OC对象引用计数默认是1...

  • iOS内存管理1:引用计数

    iOS内存管理1:引用计数 引用计数: Objecttive-C使用引用计数来进行内存管理。然后,引用计数其实是不...

  • iOS 引用计数理解

    最近在研究内存管理,所以看了很多runtime底层的代码,越深入探索越觉得自己在理解上还是出现了部分偏差,现在重新...

  • Effective Objective-C 2.0(第5章)

    编写高质量iOS与OS X代码的52个有效方法 第5章 内存管理 29.理解引用计数 引用计数机制通过可以递增递减...

  • Objective-C高级编程之内存管理篇

    iOS的内存管理是采用引用计数的方式,引用计数分为手动引用计数和自动引用计数(ARC)。前者要求开发者手动管理内存...

  • iOS概念攻坚之路(三):内存管理

    前言 iOS 的内存管理不止是 「引用计数表」。 iOS 开发者基本都知道 iOS 是通过「引用计数」来管理内存的...

  • ios内存管理记录

    ios的内存管理技术是自动引用计数也就是(Automatic Reference Counting,自动引用计数,...

  • 内存管理-MRC与ARC

    引用计数 在iOS中,使用引用计数来管理OC对象的内存1、一个新创建的OC对象引用计数默认是1,当引用计数减为0,...

  • ios内存管理机制2016

    1.说一说对内存管理的理解?(原理)iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,...

网友评论

    本文标题:iOS 引用计数理解

    本文链接:https://www.haomeiwen.com/subject/avfmoqtx.html