oc对象的种类
2021-02-04 本文已影响0人
Berning
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);
}