image

1. 从左到右:实例、对象、类

  • 对象是类的实例化,实例是对象的实例化

2. 理解self

  • 在类方法中,self指向类对象地址(即上图中间部分)
  • 在实例方法中,self指向实例地址(即上图左边部分)

3. 理解super

  • 编译器定的符号(类似while)强调的是调用父类方法

4. class方法

+ (Class)class {
    return self; //指向上图中间部分
}
- (Class)class {
    return object_getClass(self); //指向上图中间部分
}

PS: [[NSObject new] class] [NSObject class] [[NSObject class] class]都是指向同一地址

5. isKindOf方法

- (BOOL)isKindOf:aClass
{
    Class cls;
    for (cls = isa; cls; cls = cls->superclass) 
        if (cls == (Class)aClass)
            return YES;
    return NO;
}

6. isMemberOf方法 - 即isKindOf的部分条件

- (BOOL)isMemberOf:aClass
{
    return isa == (Class)aClass;
}

7. 对class取指针,并强转成NSObject对象 (等效于 对该class实例化)

id cls = [NSString class];
void* p = &cls;
[(__bridge NSString*)p class];

PS: 如上代码正常返回,并不会crash,原因在于

typedef struct objc_object *id;
struct objc_object {
    Class isa;
};

image