zoukankan      html  css  js  c++  java
  • OC_自动引用计数器_0x04

    在NSObject类的alloc类方法上,执行所调用的方法和函数:

    +alloc

    +allocWithZone

    class_createInstance

    calloc

    retainCount/retain/release实例方法又是怎样实现的呢?下面列出来:

    -retainCount

    __CFDoExternRefOperation

    CFBasicHashGetCountOfKey

    -retain

    __CFDoExternRefOperation

    CFBasicHashAddValue

    -release

    __CFDoExternRefOperation

    CFBasicHashRemoveValue

    (CFBasicHashRemoveValue返回0时,-release调用dealloc)

    各个方法都通过一个调用了__CFDoExternRefOperation函数,调用了一系列名称相似的函数。如这些函数名的前缀“CF”所示,它们包含于Core Foundation框架源代码中,

    即是CFRuntime中的__CFDoExternRefOperation函数,

    int __CFDoExternRefOperation(uintptr_t op, id obj)

    {

      CFBasicHashRef table = 取得对象对应的散列表(obj);

      int count;

      switch(op)

      {

      case OPERATION_retainCount:

        count = CFBasicHashGetCountOfKey(table, obj);

        return count;

      case OPERATION_retain:

        CFBasicHashAddValue(table, obj);

        return obj;

      case OPERATION_release:

        count = CFBasicHashRemoveValue(table, obj);

        return 0 == count;

      }

    }

    __CFDoExternRefOperation函数按retainCount/retain/release操作进行分发,调用不同的函数。NSObject类的retainCount/retain/release实例方法也许如下面

    - (NSUInteger)retainCount

    {

      return (NSUInteger)__CFDoExternRefOperation(OPERATION_retainCount, self);

    }

    - (id)retain

    {

      return (id)__CFDoExternRefOperation(OPERATION_retain, self);

    }

    - (void)release

    {

      return __CFDoExternRefOperation(OPERATION_release, self);

    }

  • 相关阅读:
    JAVA内存溢出解析(转)
    检查SQL Server 2005的索引密度和碎片信息(转)
    GWT 学习总结
    支付宝techday分享成长、团队、信任
    一位年轻董事长给年轻人的30条忠告
    Oracle 培训材料
    利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
    oracle 笔记
    JProfiler 使用说明
    最疼你的人是谁
  • 原文地址:https://www.cnblogs.com/fkunlam/p/4903828.html
Copyright © 2011-2022 走看看