自定义一个分类
@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
实例对象,类对象和元类之间的从属关系
LGPerson*p =[[LGPerson alloc]init];
p.name=@"Cooci";
p.age=18;
Class class1=[LGPerson class];
Class class2=p.class;
Class class3=object_getClass(p);
Class class4=object_getClass(class3);
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]);
}
判断实例方法和类方法分别存储在什么位置
-(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);
}