实例对象,类对象和元类之间的关系(类底层探索)

自定义一个分类

@interface LGPerson : NSObject

@property(nonatomic,copy)NSString*name;

@property(nonatomic,assign)NSInteger age;


//实例 方法
-(void)lg_instanceMethod;
//类方法
+(void)lg_classMethod;

@end
@implementation LGPerson

//实例 方法
-(void)lg_instanceMethod
{
    NSLog(@"我是一个实例方法");
}
//类方法
+(void)lg_classMethod
{
    NSLog(@"我是一个类方法");
}

@end

实例对象,类对象和元类之间的从属关系

//p-->叫实例对象
    LGPerson*p =[[LGPerson alloc]init];
    p.name=@"Cooci";
    p.age=18;
    
    
    //class1,class2和class3 都叫类对象
    Class class1=[LGPerson class];
    Class class2=p.class;
    Class class3=object_getClass(p);
    /*
     1.class4 叫元类对象.元类是一个比较虚拟的,系统会自动帮忙我们进行创建;
     2.元类是类对象所属的类;
     3.元类归属所属:根元类;
     4.根元类归属所属:是他自己.
     */
   
    //小结:实例对象的isa指针指向类,类的isa指针指向元类
    Class class4=object_getClass(class3);
    
    //内存地址都是一样的(0x10d40d968-0x10d40d968-0x10d40d968)
    NSLog(@"%p-%p-%p",class1,class2,class3);
    [self getToClassInfo:p];
获取具体的类信息
-(void)getToClassInfo:(id)objc
{
    NSLog(@"实例对象地址-%p...%@",objc,objc);
    NSLog(@"类对象地址-%p...%@",[objc class],[objc class]);
    NSLog(@"父类对象地址-%p...%@",[objc superclass],[objc superclass]);
    NSLog(@"元类对象地址-%p...%@",object_getClass(objc),object_getClass(objc));
    NSLog(@"元类的父类对象地址-%p...%@",[object_getClass(objc) superclass],[object_getClass(objc) superclass]);
    NSLog(@"根元类对象地址-%p...%@",object_getClass(object_getClass(objc)),object_getClass(object_getClass(objc)));
    NSLog(@"根元类父类对象地址-%p...%@",[object_getClass(object_getClass(objc)) superclass],[object_getClass(object_getClass(objc)) superclass]);
    NSLog(@"根根元类对象地址-%p...%@",object_getClass(object_getClass(object_getClass(objc))),object_getClass(object_getClass(object_getClass(objc))));
    NSLog(@"根根元类父类对象地址-%p...%@",[object_getClass(object_getClass(object_getClass(objc))) superclass],[object_getClass(object_getClass(object_getClass(objc))) superclass]);
    
    /**
     实例对象地址-0x600000298f20...<LGPerson: 0x600000298f20>
     类对象地址-0x108afaa28...LGPerson
     父类对象地址-0x109084310...NSObject
     元类对象地址-0x108afaa28...LGPerson
     元类的父类对象地址-0x109084310...NSObject
     根元类对象地址-0x108afaa00...LGPerson
     根元类父类对象地址-0x1090842c0...NSObject
     根根元类对象地址-0x1090842c0...NSObject
     根根元类父类对象地址-0x109084310...NSObject
     */
}
判断实例方法和类方法分别存储在什么位置
-(void)judgeMethod
{
    //类对象中可以拿到实例方法
    Method method1 =class_getInstanceMethod([LGPerson class], @selector(lg_instanceMethod));
    //元类对象是拿不到实例方法的
    Method method2=class_getInstanceMethod(objc_getMetaClass("LGPerson"), @selector(lg_instanceMethod));
    
    //类对象中获取不到类方法
    Method method3=class_getInstanceMethod([LGPerson class], @selector(lg_classMethod));
    
    //元类中可以获取到类方法
    Method method4=class_getInstanceMethod(objc_getMetaClass("LGPerson"), @selector(lg_classMethod));
}
判断实例方法和类方法指针位置
-(void)judgeMethodImp
{
    //类对象中可以拿到实例方法
    IMP imp1 =class_getMethodImplementation([LGPerson class], @selector(lg_instanceMethod));
    //类对象中获取不到类方法
    IMP imp2=class_getMethodImplementation([LGPerson class], @selector(lg_classMethod));
    
    //元类对象是拿不到实例方法的
    IMP imp3=class_getMethodImplementation(objc_getMetaClass("LGPerson"), @selector(lg_instanceMethod));
    //元类中可以获取到类方法
    IMP imp4=class_getMethodImplementation(objc_getMetaClass("LGPerson"), @selector(lg_classMethod));
    
    NSLog(@"%p-%p-%p-%p",imp1,imp2,imp3,imp4);
    
    /**
     imp1    IMP    (OCTest`-[LGPerson lg_instanceMethod] at LGPerson.m:13)    0x0000000101d607c0
     
     imp2    IMP    (libobjc.A.dylib`_objc_msgForward)    0x00000001022bf140 ==>跳转到了消息转发函数
     
     imp3    IMP    (libobjc.A.dylib`_objc_msgForward)    0x00000001022bf140  ==>跳转到了消息转发函数
     
     imp4    IMP    (OCTest`+[LGPerson lg_classMethod] at LGPerson.m:18)    0x0000000101d607f0
     */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值