iOS内存管理机制

作者: ERICBROTHER | 来源:发表于2019-06-08 22:55 被阅读135次

    内存管理遵循的原则:

        1:自己生成的对象,默认自己持有;

        2:非自己生成的对象,默认不持有; 

        3:不再需要自己持有的对象时释放;

        4:非自己持有的对象无法释放。

        总结一下就是谁生成谁释放,谁引用谁释放。

    什么是自己的生成的对象?

         使用以alloc/new/copy/mutableCopy开头命名(驼峰规则)的方法就是自己生成的对象,除此之外的方法都是非自己生成的对象,如[NSMutableArray array]中的array方法。

    以下是示例:

        自己产生的对象

    自己生成对象,自己释放对象 调用release之后马上释放

            对于上述自己产生的对象自己持有并释放很好理解,接下来看看非自己产生的对象是如何处理的。

        非自己产生的对象

    非自己生成对象返回持有对象 调用方法

             这个时候调用者就会困惑了,不是自己产生的对象我到底要不要释放?根据以上的实现是需要调用者主动释放的,可是调用者又说了,明明不是我生成的对象凭什么要我释放?为了解决这个困惑就有了这个原则,非自己产生的对象默认不持有,不需要你释放。那不用调用者释放由谁来释放呢?为了解决这个问题就引入了autorelease机制。

    非自己生成的对象由autorelease管理

    ARC帮我们做了那些事?

        主要是苹果用__strong,__weak,unsafe_unretained,__autoreleasing这几个修饰符帮我们做了那些事。

    id类型和对象类型的默认修饰符__strong

        __strong修饰的对象会强引用对象,它不仅在变量作用域还是还是在赋值上都能帮我们管理对象,在超出作用域是会默认调用[id release]方法,赋值会处理调用[id retain],[id release]方法。

    比较特别的是在初始化时有两种情况要区分:自己生成的对象以及非自己生成的对象。

    自己生成的对象已经持有不需要再retain 非自己生成的对象没有持有需要retain

        在__strong强引用非自己生成对象,上述是为了便于理解直接写了[person retain],实际上苹果内部有自己的实现逻辑,但最终效果是一样的。其他几个修饰符大同小异,就不写了。

    与CoreFoundation的转换

    __bridge、__bridge_retained、__bridge_transfer

    delloc调用的方法

    _objc_rootDealloc、objc_dispose、objc_destructInstance、objc_clear_deallocating

    相关文章

      网友评论

        本文标题:iOS内存管理机制

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