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方法。

      

  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/4296826.html
Copyright © 2011-2022 走看看