zoukankan      html  css  js  c++  java
  • OC语法6——内存管理之引用计数器(retain,release)

    OC内存管理:

      一、引用计数器:

      Java有垃圾回收机制(Garbage Collection,GC)。也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它占用的内存。

      但OC没有垃圾回收机制,需要开发者手动销毁创建的对象,收回内存。OC中没有垃圾回收机制,而是通过“引用计数器”来管理内存的。

      引用计数器:OC中的对象内部都有一个记录有关对象内存状态的整数,把这个整数就叫做引用计数器。

      当调用alloc,new,copy等创建新对象时,计数器置为1;当调用retain时计数器便加1;当调用release是计数器便减1;

      当计数器为0时,系统会自动调用dealloc方法,销毁该对象,释放占用的内存。

    ————————————————————————————————————————

      二、分析对象的引用计数器:

      因为没有Xcode写代码的例子,所以先把“内存管理的原则”的总结放在开学后。在这里先列出大纲:

      1.通过引用计数器分析对象不同阶段引用计数器的值(retainCount);

      2.内存管理的原则是“谁创建,谁释放”,怎么深刻理解这句话?

      真实开发环境中对象的调用时错综复杂的,那我们该如何进行内存管理,该如何理解“谁创建,谁释放”?(set方法里调用retain,重写的realloc里调用release

      三、自动释放池:

      为了便捷,OC也提供了一种半自动回收内存机制,即“自动释放池”。

      首先通过@autoreleasepool{ }定义一个代码块,这就是“自动释放池”;

      然后在创建对象时只要调用autorelease方法,则就相当于把该对象放入自动释放池。

      当代码块执行完后,会一次性的对放入其中的所有对象调用一次release方法,从而可以起到自动释放内存的功能。

      自动释放池的本质:

      自动释放池和Java的垃圾回收机制是不同的。它的本质是对放入“池”中的对象统一调用一次release方法。

      所以,也需要注意,并不是说放入池中的对象就一定会被销毁。(假如该对象调用过retain方法,放入池时计数器为2,则通过自动释放池统一调用release后,计数器为1,该对象并不会被销毁)

      因为自动释放池延迟了对象的销毁,而进行统一销毁。当对象很多或者占很大内存时不宜采用自动释放池,不应该让他们长期驻留。

      

      需要说明的是,OC类库中的静态方法一般不需要手动释放,内部已经调用了autorelease方法。

      

  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/4296826.html
Copyright © 2011-2022 走看看