super对象以及super消息发送

一:举例说明

        NSLog(@"[self class] = %@",[self class]);

        NSLog(@"[self superclass] =%@",[self superclass]);

        NSLog(@"-----------------------------------------------");

//    [super class]底层实现是:

//      object_messendSuper({self,[lzhPerson class]},@selector(class));

//      1.参数1:结构体对象  1.消息接收者2.从哪个类开始查找实现;是父类开始查找实现;

//        2.参数2:方法名

        NSLog(@"[super  class]= %@",[super  class]);

        NSLog(@"[super superclass] =%@",[super superclass]);

1.注意点:

所有class类都有 class方法,所以class方法在nsobject里面实现;不管self还是super调用都是调用的nsobject的class方法;

二: [super class]的底层实现

    ((void(*)(__rw_objc_super *, SEL))(void*)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Student"))}, sel_registerName("run"));

      object_messendSuper({self,[lzhPerson class]},@selector(class));

        1.参数1:结构体对象  1.消息接收者2.从哪个类开始查找实现;是父类开始查找实现;

         2.参数2:方法名

2.1 声明一个结构体对象super对象;

struct objc_super {

    __unsafe_unretained _Nonnull id receiver;//消息接收者

    __unsafe_unretained _Nonnull Class class;//消息接收者的父类;指定方法的实现,从那个类开始搜索;

// class实际上就是传入的当前的类,在底层会调用objc_msgSendSuper2里面会 [viewcontroller class]->superClass再去获取父类的值;其实也是就是父类类型;

};

2.2  [super run];使用super对象调用函数底层实现如下:

   struct__rw_objc_super args = {

        self,

        class_getSuperclass(objc_getClass("Student")),《==》[Person class];

        sel_registerName("run")

    };

     objc_msgSendSuper(args,@selector("run"));

   1.消息接收者仍然是子类对象;

   2、从父类开始查找方法的实现;

   3.由于class都是nsobjec的对象,所以查找的都是方法是一样的;消息接收者是self的对象子类的;所以打印为student的类;

     sueprclass的原理等价于calss;

2.3、class函数的底层实现;

-(Class)class{

return  objc_getClass(self);

}

-(Class)superclass{

  return  class_getSuperClass(objc_getClass(self));

}

 注意:class返回的是self的类型;superclass返回的当前对象父类类型

你可能感兴趣的:(super对象以及super消息发送)