Runtime-object_getClass(id)

162 阅读1分钟

困惑我很久的一个问题,直接上Demo代码

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

+ (void)run;
- (void)walk;

@end
实例化
Person *p = [[Person alloc]init];
NSLog(@"%@-%@-%@", object_getClass(p),object_getClass([p class]),object_getClass([Person class]));

打印的结果是:Person-Person-Person

也许是我的理解不够深,一开始我是懵逼的,但是如果结合如下runtime代码来理解呢:

1、object_getClass(id)
   请记住参数id是一个对象,它返回的是这个id的isa指针所指向的Class,如果传参是Class,则返回该Class的metaClass。
2、类对象的结构体
struct objc_class {
    Class _Nonnull isa ;

    Class _Nullable super_class                              
    const char * _Nonnull name                               
    long version                                             
    long info                                                
    long instance_size                                       
    struct objc_ivar_list * _Nullable ivars                  
    struct objc_method_list  * _Nonnull methodLists 
    struct objc_cache * _Nonnull cache                       
    struct objc_protocol_list * _Nullable protocols
} 

总结

p 是 Person 的实例对象:

Class pClass = [p class] = [Person class];

pClass自身也是一个对象,