oc对象的种类

2021-02-04  本文已影响0人  Berning

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

instance对象

//创建
[[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对象

//创建 
[ obj class]
[NSObject class]
Class  object_getClass(id  obj) 
Class objc_getClass(const char * name)

meta-class 对象

Class object_getClass(id obj)

区别

Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}
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 {
    return self;
}

- (Class)class {
    return object_getClass(self);
}
上一篇下一篇

猜你喜欢

热点阅读