面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点。OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到。
说到继承呢,想到了一本书上是引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦。人和妖都属于动物类,但各自有各自的特点,各自有各自的不同,动物就是父类,而人和妖就是子类。继承的目的是为了减少代码的冗余,还是DRY原则(don`t repeat yourself)。
在Objective-C中super是指向直接父类的指针,而self是指向本身的指针,self就相当于java中的this指针。在OC中写类时可以在@implementation中定义哪些在@interface中无相应声明的方法,但这个方法是私有的,仅在类的实现中使用。
在Objectiv-C中几乎所有的类都是继承自NSObject类,NSObject类中存在大量功能强大的方法。下面对NSObject类中的各种方法进行试验和介绍:
1. +(void) load; 类加载到运行环境时调用该方法
测试:在子类中重写load方法来进行测试, 当重写完load方法,在mian方法中不需要任何实例化任何对象
当类被加载时load就会别调用.load是类方法,可以直接被类调用
1 2 3 4 5 |
//重写NSObject中的load方法 +(void) load { NSLog(@"ObjectTest中的load方法被调用啦!!"); } |
运行结果:
1 |
2014-07-30 08:58:31.704 HelloOC[550:303] ObjectTest中的load方法被调用啦!! |
2. +(void) initialize; 在类第一次使用该类时调用该方法,第二次就不调用了
测试:重写initalize方法
1 2 3 4 5 |
//重写initialize方法,会在类第一次使用时调用 +(void) initialize { NSLog(@"initialize方法被调用了(类第一次被实例化)!"); } |
运行结果:
1 2 |
2014-07-30 09:27:53.767 HelloOC[624:303] load方法被调用啦!! 2014-07-30 09:27:53.769 HelloOC[624:303] initialize方法被调用了(类第一次被实例化)! |
3. +(id) alloc: 返回一个已经分配好的内存对象; -(id) init: 对已经分配了内存的实例进行初始化; new同时调用了alloc 和 init
demo: Object *object = [[Object alloc] init];
可以在子类中把alloc进行重写,然后观察运行情况
1 2 3 4 5 6 |
//重写alloc方法 +(id) alloc { NSLog(@"alloc函数被调用啦"); return [super alloc]; } |
1 2 3 4 5 6 7 |
//重写init -(id) init { NSLog(@"init被调用了"); self = [super init]; return self; } |
测试方法一个用alloc和init实例化类,一个用new实例化类:
1 2 3 4 5 |
//第一次使用ObjectTest类 ObjectTest *o1 = [[ObjectTest alloc] init]; //第一次使用ObjectTest类 ObjectTest *o2 = [ObjectTest new]; |
运行结果:
1 2 3 4 5 6 |
2014-07-30 09:59:58.991 HelloOC[689:303] load方法被调用啦!! 2014-07-30 09:59:58.993 |