所有类都继承 NSObject(排除特殊的类,比如NSProxy) ,那么下面我们来看看NSObject内部是如何实现,内部实现代码如下:
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
这说明NSObject是一个结构体指针,是一个isa指针,那么isa是干嘛用的呢,既然isa是一个指针,必然指向某个地方,那它指向哪里呢?
现在我们创建一个Car类 里面有两个方法分别是实例方法和类方法
-(void)run;
+(void)run;
然后调用 Car * car = [ Car alloc]init];
[car run ];
[Car run];
然后看下面这幅图
当我们调用[car run ],通过isa指针找到class再找到对象方法的实现并调用
当我们调用[Car run],通过isa指针找到meta-class再找到类方法的实现并调用
这样就串起来了
上面我们看到还有一个superclass,其实它也是一个指针,比如Car继承自NSObject,那Car的superclass就是NSObject,是通过superclass这个指针去查找到的
在比如[ car init]我们这样去调用 这个init方法是NSObject,也就是说先通过car的isa指针找到car class,在通过class 的superclass指针找到meta-class再找到类方法的实现并调用,如果没有父类superclass为nil