ARC实现源码笔记

下面是runtime中关于ARC的数据结构部分:

未命名.001.jpeg

Weak引用实现

NSObject中定义了两个方法:

id objc_storeWeak(id *location, id newObj)
{
    return storeWeak<true/*old*/, true/*new*/, true/*crash*/>
        (location, (objc_object *)newObj);
}

id objc_storeWeakOrNil(id *location, id newObj)
{
    return storeWeak<true/*old*/, true/*new*/, false/*crash*/>
        (location, (objc_object *)newObj);
}

第二个方法与第一个作用类似,都是调用的storeWeak模版函数,只不过第三个模版参数传入的值是false,表示如果要存储的值释放了或者要存储的值的类不支持weak引用,就会存储一个nil,而不是crash掉。

Runtime会维护一个SideTables,如下代码所示:

alignas(StripedMap<SideTable>) static uint8_t 
    SideTableBuf[sizeof(StripedMap<SideTable>)];

static void SideTableInit() {
    new (SideTableBuf) StripedMap<SideTable>();
}
//SideTables就是一个StripedMap,id为key,值为SideTable
static StripedMap<SideTable>& SideTables() {
    return *reinterpret_cast<StripedMap<SideTable>*>(SideTableBuf);
}

而SideTables就是一个StripedMap,它以id为key,sideTable为值。那么SideTable的结构式什么样子呢?如下:

struct SideTable {
    spinlock_t slock;
    RefcountMap refcnts;
    weak_table_t weak_table;

    SideTable() {
        memset(&weak_table, 0, sizeof(weak_table));
    }

    ~SideTable() {
        _objc_fatal("Do not delete SideTable.");
    }

    void lock() { slock.lock(); }
    void unlock() { slock.unlock(); }
    bool trylock() { return slock.trylock(); }

    // Address-ordered lock discipline for a pair of side tables.

    template<bool HaveOld, bool HaveNew>
    static void lockTwo(SideTable *lock1, SideTable *lock2);
    template<bool HaveOld, bool HaveNew>
    static void unlockTwo(SideTable *lock1, SideTable *lock2);
};

我们关注的是weak_table_t这个数据结构,它针对这个对象的weak引用表。如下:

struct weak_table_t {
    weak_entry_t *weak_entries;//引用项
    size_t    num_entries;//引用次数
    uintptr_t mask;
    uintptr_t max_hash_displacement;
};

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,789评论 0 9
  • 我是一个没有上大学但做梦都想上大学的人,于是我知道,没有实现的梦想,只有在平时生活中弥补这一遗憾,所以我为了能让别...
    雪狼突击阅读 370评论 0 0
  • 前两天一位女友阿妹失恋,简直天要塌了,见到朋友就哭得稀里哗啦,人也瘦的皮包骨头,似乎工作也放弃了,诉苦到不行,说是...
    小状一名阅读 723评论 1 3
  • 桌子上放了一碗红烧肉。 切成方块状的肉,全身浸透了老抽熬制出来的酱色,黄澄澄的冒着油光,看一眼,已经垂涎三尺了。 ...
    卡茉阅读 873评论 0 1
  • 1912年的一天,号称“永不沉没”的泰坦尼克号,最终沉没在蔚蓝的大西洋海面上,那么那天船上的人究竟经历些什么,...
    i_0449阅读 262评论 0 0