专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
前端大全  ·  前端行情变了,差别真的挺大。。。 ·  13 小时前  
前端早读课  ·  【第3530期】像高手一样调试程序 ·  18 小时前  
共产党员  ·  黄宗德:英雄无悔 许党报国 ·  昨天  
共产党员  ·  黄宗德:英雄无悔 许党报国 ·  昨天  
前端早读课  ·  【第3529期】从自动补全到得力助手:训练 ... ·  昨天  
天津市应急管理局  ·  沉浸式互动宣传 带您查找身边安全隐患 ·  3 天前  
天津市应急管理局  ·  沉浸式互动宣传 带您查找身边安全隐患 ·  3 天前  
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

老生常谈category增加属性的几种操作

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-07 15:56

正文

请到「今天看啥」查看全文


) { if (!cls) return NO; if (! type ) type = "" ; if (name && 0 == strcmp(name, "" )) name = nil; rwlock_writer_t lock(runtimeLock); assert(cls->isRealized()); // No class variables if (cls->isMetaClass()) { return NO; } // Can only add ivars to in -construction classes. if (!(cls->data()->flags & RW_CONSTRUCTING)) { return NO; } } // 重点在这最后一句,前面我们已经看到 objc_allocateClassPair 函数所分配的新类的flags位信息,在此处 & RW_CONSTRUCTING,必定为真,取反后跳过大括号向下执行。
  1. 已经存在的类,经过测试,flag位为 RW_REALIZED|RW_REALIZING,设置函数如下:
static Class realizeClass(Class cls)
{
    runtimeLock.assertWriting();

    const class_ro_t *ro;
    class_rw_t *rw;
    Class supercls;
    Class metacls;
    bool isMeta;
    
    if (!cls) return nil;
    if (cls->isRealized()) return cls;
    assert(cls == remapClass(cls));

    // fixme verify class is not in an un-dlopened part of the shared cache?

    ro = (const class_ro_t *)cls->data();
    if (ro->flags & RO_FUTURE) {
        // This was a future class. rw data is already allocated.
        rw = cls->data();
        ro = cls->data()->ro;
        cls->changeInfo(RW_REALIZED|RW_REALIZING, RW_FUTURE);
    } else {
        // Normal class. Allocate writeable class data.
        rw = (class_rw_t *)calloc(sizeof(class_rw_t), 1);
        rw->ro = ro;
        rw->flags = RW_REALIZED|RW_REALIZING;
        cls->set






请到「今天看啥」查看全文


推荐文章
前端大全  ·  前端行情变了,差别真的挺大。。。
13 小时前
前端早读课  ·  【第3530期】像高手一样调试程序
18 小时前
共产党员  ·  黄宗德:英雄无悔 许党报国
昨天
共产党员  ·  黄宗德:英雄无悔 许党报国
昨天
天津市应急管理局  ·  沉浸式互动宣传 带您查找身边安全隐患
3 天前
天津市应急管理局  ·  沉浸式互动宣传 带您查找身边安全隐患
3 天前
爱股君2020  ·  【速递】30日晚间重要公告精华版
8 年前
肥肥猫的小酒馆  ·  焦虑,是这个时代的社会病
8 年前