美文网首页iOS Developer
IOS的 实例对象、 类对象、元类

IOS的 实例对象、 类对象、元类

作者: LeeDev | 来源:发表于2017-08-11 21:14 被阅读383次

实例对象:就是我们通常的类的实例化的对象比如Obj * obj = [Obj new];,那么这个obj 就是一个实例对象
类对象:这个时候是否有点奇怪,其实类也是一个对象,比如Obj 其实也是一个对象
元类:其实就是 类对象的isa指向的类。

  1. 可能前面的定义有点模糊,下面我们看看,runtime里面的 实例的结构体和 类的结构体
----------------------------------------------------
//类的实例
typedef struct objc_object *id;
/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
这里有个isa 指针,指向的就是 当前实例的类对象
----------------------------------------------------

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY; //
#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;//父类
    const char *name                                         OBJC2_UNAVAILABLE;//类名
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;//实例大小
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;//成员变量列表
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;//方法列表
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;//方法缓存
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;//协议列表
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

这里也是有个isa 指针,其实这个isa 指向的就是  **元类**
----------------------------------------------------

2、下面我们来看一个例子,方便更好的来理解元类的概念
同时我们首先理解几个知识点
object_getClass(实例对象) == [实例对象 class]
[类对象 class] == 类对象
object_getClass(类对象) == 类对象的isa == 元类
object_getClass(类对象) != [类对象 class]
添加方法,其实是在 类对象/实例对象 中的isa指针的类中添加

首先定义一个 Obj的类
----------------------------------------------------
@interface Obj : NSObject
//实例方法
- (void)print1;
//类对象方法
+ (void)classPrint;
@end
@implementation Obj
//这里不去实现它,后面我们会通过runtime的知识添加方法
@end

下面我们切换当控制器中
----------------------------------------------------

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    Obj * obj = [Obj new];
    Class class11 = object_getClass(obj);
    Class class12 = [obj class]; //这个是获取当前的类的对象,实例是就是isa指向的类对象,但是类对象指向确是自己本身
    
    
    
    NSLog(@"class1 :%p,class2 = %p",class11,class12);
    //class1 :0x1077b8f00,class2 = 0x1077b8f00
    
    
    Class class21 = object_getClass(class11);//Son的Class的元类
    Class class22 = [class12 class];//还是本身Son的Class
    Class classMeta= objc_getMetaClass(object_getClassName(obj));//Son的Class元类
    
    NSLog(@"class1 :%p,class2 = %p,classMeta = %p",class21,class22,classMeta);
    //class1 :0x1077b8ed8,class2 = 0x1077b8f00,classMeta = 0x1077b8ed8
    //在给对象或者类添加方法的时候,其实是给isa 指向的类添加方法,就是说 一个普通的对象是给它的class添加方法,而 一个普通的类对象,需要添加方法其实是给它isa指向的 元类添加方法
    
    //给obj实例对象 添加 方法
    class_addMethod(class11, @selector(print1), (IMP)IMPFunc, NULL);
    [obj print1];
    
    //给obj的类对象添加方法
    class_addMethod(class21, @selector(classPrint), (IMP)IMPMetaClassFunc, NULL);
    [Obj classPrint];
    
}

void IMPFunc(id self ,SEL cmd) {
    
    NSLog(@"print1");
}
void IMPMetaClassFunc(id self ,SEL cmd) {
    
    NSLog(@"IMPMetaClassFunc");
}

相关文章

  • iOS内存分配

    iOS对象有3种: 实例对象 类对象 元类对象 对象(对象都是结构体)的内存中,包含的指针: isa 实例对象is...

  • oc对象实现图解

    ios第一篇(oc对象) ios类对象和元类对象以及对象的关系 类对象中存储的是对象的实例方法,属性,成员变量,协...

  • iOS-对象、isa指针、SuperClass

    OC中对象分类 分为三类:实例对象、类对象、元类对象 instance对象(实例对象) class对象(类对象) ...

  • isa 和 superclass

    实例对象的 isa 指向类对象,类对象的 isa 指向元类对象,元类的isa 指向基类的元类对象,基类的元类对象的...

  • iOS 的实例对象、类、元类

    级别:★★☆☆☆标签:「实例对象」「类」「元类」「实例对象、类、元类」作者: ITWYW[https://www....

  • 类的结构分析

    对象、类、元类、根元类 对象是类的实例,对象是以类为模版来创建的。类的实质上也是一个对象,类是元类的实例对象。类对...

  • iOS类的结构分析

    一、实例对象、类、元类关系分析 1. 实例对象、类、元类关系图解析 我相信上面这张经典的实例对象、类、元类关系图大...

  • IOS的 实例对象、 类对象、元类

    实例对象:就是我们通常的类的实例化的对象比如Obj * obj = [Obj new];,那么这个obj 就是一个...

  • RunTime底层原理

    1.isaisa:实例对象的isa指向类对象,类对象的isa指向元类对象。元类对象isa执行基类元类对象。2.方法...

  • Object-C 方法查找原理(对象、isa和SuperClas

    Q:OC中对象分类 A:总共为三类:实例对象、类对象、元类对象 instance对象(实例对象) class对象(...

网友评论

    本文标题:IOS的 实例对象、 类对象、元类

    本文链接:https://www.haomeiwen.com/subject/idwrrxtx.html