美文网首页
iOS引用计数讨论

iOS引用计数讨论

作者: 烟影很美 | 来源:发表于2016-03-18 19:02 被阅读1369次

首先看下面这段代码

打印结果为: -1 1

我们忽略掉那个[str retain], 因为retain操作只会增加引用计数(相信系统, 相信Xcode). 那么为什么会是这样的打印结果?

首先需要明白的是, 引用计数机制只使用在堆中, 那么所有不保存在堆中的数据的引用计数都为-1. 

在OC中, 几乎所有不可变对象(常量)都存在常量区(没有一一测试测, 有兴趣的可以试试), 内存管理由系统来做. 代码中的str系统默认是一个常量, 所以保存在常量区, 所以引用计数为-1. 哪怕是显式使用了alloc也同样不会保存在堆上, 所以引用计数还是-1.

但是, 既然常量保存在常量区, 那str1为什么引用计数为1? 

这个, 私心想着(猜测), 所有可以有多个参数的初始化方法都有可能出现这种情况, 如果一个方法有多个参数, 那么方法内部就会有一个长度可变的数组保存参数(查看OC某些多参方法的声明, 出现va_list类型, 即可变数组类型), 因为长度不确定只能保存在堆中, 然后在方法执行过程中对数据处理后, 并没有将数据转存到栈中, 所以引用计数会+1;

亲测, 当format后面的字符串长度大于等于12时, 引用计数为1. 这个现象存在于initWithFormat:和stringWithFormat:方法, 至于有没有其他方法也会有这种情况不敢确定.

而在数组的初始化方法中initWithObjects:方法当参数为nil时引用计数为-1, 但是当有非nil参数的时候, 哪怕是空字符串@"", 引用计数都会成为1.

至于为什么会出现当参数长度大于某个值时才出现引用计数加一的情况, 可能是和栈内存分配有关, 因为不了解这个方面的细节, 就不多说了.

相关文章

  • iOS引用计数讨论

    首先看下面这段代码 打印结果为: -1 1 我们忽略掉那个[str retain], 因为retain操作只会增加...

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

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

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

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

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

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

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

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

  • ios内存管理记录

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

  • ios-散列表

    ios 引用计数 retain release过程中不免要操作一张散列表(taggedPoint 也不在此次讨论范...

  • 内存管理-MRC与ARC

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

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

  • iOS内存管理探底

    一、引用计数(保留计数) iOS的内存管理主要是依赖引用计数,so,我们扯扯这个的工作原理: 二、属性修饰方法as...

网友评论

      本文标题:iOS引用计数讨论

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