类的继承(Inheritance)
对象可以调用自己的方法,以及父类的方法,父类的父类的…NSObject的方法。也可以重新定义祖先的方法(方法名称与祖先相同),这叫重写(overriding),重写的方法也可以被子类继承。
在Objective-C语言中,所有的类都继承于NSObject这个类,所以说NSObject这个类是根类(就 像树根一样,所有的枝干都发于树根)。所有的类都可以有子类,除了NSObject根类外,其余类都有自己的父类。当类创建出一个新的对象实例变量,这个对象就拥有了它自己的属性和方法,它的父类的属性和方法以及父类的父类的…根类NSObject的属性和方法。
当一个新的对象被创建后,系统会分配一定的内存空间给它,并且会初始化这个对象中的各种属性的值。每一个对象中都有一个成员变量isa,这是NSObject类中的成员变量,其指向一个结构体,这个结构体用于表示类的结构体,称之为类结构体。结构体中包括:该类独有的数据成员的类型(注意是类型,不是数据成员的值,地址什么的),函数列表,以及一个指向父类的类结构体指针(因为OC不允许多重继承,所以一个就够了)。其中函数列表通过一个映射列表实现的,给出一个键值将得到一个函数地址如果该键值存在的话。
大部分程序员都会花费大量的时间去定义类,继承(Inheritance)提供了一种非常方便的方法,极大地减少了定义大量类时花费的编码时间。例如:NSButton类可以创建出按钮的对象,因为NSButton中包含了创建一个按钮对象所需的属性和方法。如果一个类可以继承NSButton类中的属性和方法,就像儿子继承父亲的特征一样,那么这个类就是NSButton的子类,而NSButton就是该类的父类。那么这个子类也可以创建出一个按钮对象,但或许增加了一些新的功能,比如可以创建一个拥有彩色边框的按钮。同样地,NSTextField的子类或许可以画出不同的边框。如此,继承的使用就真正地极大地减少了定义类时需要的代码。
而且OC里面的类函数调用,或者称之为消息传递(更为贴切一点),都将被编译器改写为一个叫objc_sendMsg(实体对象指针,函数索引值,参数列表)的函数。该函数将通过isa指针,找到类结构体中对应的函数,如果存在则调用该函数,并传递相应参数。否则,通过类结构体的父指针找到父类的类结构体,查找函数是否存在,存在则调用,否则一直向上追溯,如果最终没有找到,则抛出异常。
除了NSObject类之外,每一个类都有一个且仅有一个自己的父类(superclass),但可以有很多的子类,就像自己有很多的孩子。每个类都继承自父类并有自己的特点,所以可以说是父类的一个更精细化的类。
{$ activeFileHint $}