Objective-C Class and Object
Objective-C是一门面向对象的编程语言,既然是面向对象,那我们就有必要对它的对象作进一步的理解,而且它的很多特性与这也大有关系。
1.Class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
2.Object
1 2 3 4 |
|
从头文件的定义可以看出,对象的内存布局以一个Class 类型的isa指针开始,而类的内存布局也是以一个Class类型的isa指针开始,所以类也是对象,这样就满足了面向对象编程语言中所有的东西都是对象。
对象是对象,类也是对象。很容易混淆是吧,所以OC重用了一个术语来区分它们:类对象(Class Object);实例对象(Instance Object)。实例对象的isa指针指向的类叫Class,类对象的isa指针指向的类叫meta-class。meta-class的isa指针指向根类meta-class,根类meta-class的isa指针指向自己。让我们看张图:
那么类对象是怎么创建的呢?经过查找,得到的结论是编译器创建的,编译时所谓的类是指类对象(官方文档: The class object is the compiled version of the class.)。
3.category
因为对象在内存中的排布可以看成一个结构体,该结构体的大小并不能动态变化。所以无法在运行时动态给对象增加成员变量。 相对的,对象的方法定义都保存在类的可变区域中。Objective-C 2.0并未在头文件中将实现暴露出来,但在Objective-C 1.0中,我们可以看到方法的定义列表是一个名为 methodLists的指针的指针。通过修改该指针指向的指针的值,就可以实现动态地为某一个类增加成员方法。这也是Category实现的原理。同时也说明了为什么Category只可为对象增加成员方法,却不能增加成员变量。
4.方法混写
因为对象的方法可以改变,因此我们就有了方法混写的技术。
5.isa混写
除了对象的方法可以动态修改,因为isa本身也只是一个指针,所以我们也可以在运行时动态地修改isa指针的值,达到替换对象整个行为的目的。
典型示例:KVO。
6.参考资料
1.iOS 6 Programming Pushing the Limits, Rob Napier, Mugunth Kumar
2.深入浅出Cocoa之类与对象
3.深入浅出Cocoa 之动态创建类
4.Objective-C对象模型及应用
5.Objective-C对象之类对象和元类对象(一)
6.Objcclass