在 ios 开发中,类也是一个对象,我们称之为类对象, 所有对象中,包含实例对象和类对象,都含有一个isa 指针。实例对象的isa指针, 指向他的类对象,类对象的isa 指针, 指向他的元类。系统判断一个对象属于哪个类,也是通过这个对象的isa指针的指向来判断。对象中的成员变量,存储在对象本身,对象的实例方法,存储在他的isa 指针所指向的对象中,即:减号方法,存储在类对象中,类方法,存储在类对象isa所指向的元类中,成员变量的值,储存在对象中。
对象在调用减号方法的时候,系统会在对象的isa指针所指向的类对象中寻找方法,这一段在kvo的实现原理中就能看到,kvo的实现原理就是系统动态的生成一个类对象,这个类是监听对象的类的子类,在生成的类中重写了监听属性的set方法,实现对set方法的监听,之后将监听对象的isa指针指向系统动态生成的这个类,当监听对象调用set方法时,由于监听对象的isa指针指向的是刚刚动态生成的类,所以在其中找的的set方法也是重写过有监听功能的set方法,这就是kvo的实现原理。同理,我们也可以通过rutime中的方法设置某个对象isa指针指向的类对象,让对象调用一些原本不属于他的方法。可以,但没必要。
下面附上isa指针指向图