美文网首页
oc对象的种类

oc对象的种类

作者: Berning | 来源:发表于2021-02-04 16:25 被阅读0次

    oc对象:instance对象,class对象,meta-class 对象

    instance对象

    • isa
    • 其他成员变量
    //创建
    [[NSObject alloc] init]; 
    [NSObject new]
    id _Nullable class_createInstance(Class _Nullable cls, size_t extraBytes)
    id _Nullable objc_constructInstance(Class _Nullable cls, void * _Nullable bytes)
    

    class对象

    • isa
    • superclass
    • 属性信息 (property)
    • 对象方法信息 (instance method)
    • 协议信息 (protocol)
    • 成员变量信息 (ivar)
    //创建 
    [ obj class]
    [NSObject class]
    Class  object_getClass(id  obj) 
    Class objc_getClass(const char * name)
    

    meta-class 对象

    • isa
    • superclass
    • 类方法(class method)

    Class object_getClass(id obj)

    区别

    • Class object_getClass(id obj)
    Class object_getClass(id obj)
    {
        if (obj) return obj->getIsa();
        else return Nil;
    }
    
    • Class objc_getClass(const char * name)
    Class objc_getClass(const char *aClassName)
    {
        if (!aClassName) return Nil;
    
        // NO unconnected, YES class handler
        return look_up_class(aClassName, NO, YES);
    }
    
    //大致实现 :通过传入字符串在hash表实现的maptable中查找并返回类
    look_up_class -> 
    getClassExceptSomeSwift -> 
    getClass_impl ->
    Class)NXMapGet(gdb_objc_realized_classes, name) ->
    _NXMapMember(table, key, &value)  ->
    
    static INLINE void *_NXMapMember(NXMapTable *table, const void *key, void **value) {
        MapPair *pairs = (MapPair *)table->buckets;
        unsigned    index = bucketOf(table, key);
        MapPair *pair = pairs + index;
        if (pair->key == NX_MAPNOTAKEY) return NX_MAPNOTAKEY;
        validateKey(table, pair, index, index);
    
        if (isEqual(table, pair->key, key)) {
        *value = (void *)pair->value;
        return (void *)pair->key;
        } else {
        unsigned    index2 = index;
        while ((index2 = nextIndex(table, index2)) != index) {
            pair = pairs + index2;
            if (pair->key == NX_MAPNOTAKEY) return NX_MAPNOTAKEY;
            validateKey(table, pair, index, index2);
            if (isEqual(table, pair->key, key)) {
                *value = (void *)pair->value;
            return (void *)pair->key;
            }
        }
        return NX_MAPNOTAKEY;
        }
    }
    
    
    
    • (Class) class
    • (Class) class
    + (Class)class {
        return self;
    }
    
    - (Class)class {
        return object_getClass(self);
    }
    

    相关文章

      网友评论

          本文标题:oc对象的种类

          本文链接:https://www.haomeiwen.com/subject/pjnrfktx.html