面向对象
编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的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是类方法,可以直接被类调用
?
??
//重写NSObject中的load方法
+(void) load
{
? ? NSLog(@"ObjectTest中的load方法被调用啦!!");
}
? ?运行结果:
?
2014-07-30 08:58:31.704 HelloOC[550:303] ObjectTest中的load方法被调用啦!!
??
?
? ? ? ? 2. +(void) initialize; ?在类第一次使用该类时调用该方法,第二次就不调用了
?
? ? ? ? ? ? ? ? 测试:重写initalize方法
?
?
//重写initialize方法,会在类第一次使用时调用
+(void) initialize
{
? ? NSLog(@"initialize方法被调用了(类第一次被实例化)!");
}
? ? ? ? ? ? 运行结果:
?
?
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进行重写,然后观察运行情况
?
?
//重写alloc方法
+(id) alloc
{
? ?NSLog(@"alloc函数被调用啦");
? ? return [super alloc];
?
//重写init
-(id) init
{
? ? NSLog(@"init被调用了");
? ? self = [super init];
? ? return self;
}
? ? ? ??
?
? ? ? ? 测试方法一个用alloc和init实例化类,一个用new实例化类:
?
?
//第一次使用ObjectTest类
ObjectTest *o1 = [[ObjectTest alloc] init];
?
//第一次使用ObjectTest类
ObjectTest *o2 = [ObjectTest new];
? ? ? ? ? ? ? ? 运行结果:
?
?
2014-07-30 09:59:58.991 HelloOC[689:303] load方法被调用啦!!
2014-07-30 09:59:58.993 HelloOC[689:303] initialize方法被调用了(类第一次被实例化)!
2014-07-30 09:59:58.993 HelloOC[689:303] alloc函数被调用啦
2014-07-30 09:59:58.993 HelloOC[689:303] init被调用了
2014-07-30 09:59:58.994 HelloOC[689:303] alloc函数被调用啦
2014-07-30 09:59:58.994 HelloOC[689:303] init被调用了
? ? ?4.-(void)dealloc 释放对象自身所占有的内存;
?
?
?
? ? 5. -(Class)class 或者 +(Class)class 返回当前对象的所属类; ?-(Class)superclass 或者 +(Class)superclass返回当前类的父类
?
?
//返回当前对象所对应的类
NSString *className =(NSString *) [self class];
NSLog(@"%@类的display方法", className);
?
//返回当前对象所对应的父类
NSString *superClassName = (NSString *) [self superclass];
NSLog(@"%@类的父类是%@", className, superClassName);
?
?
? ? 6、-(BOOL)isKindOfClass : (Class)aClass 判断某个实例是否属于某个类或者子类的对象
?
? ? ? ? 事例代码如下:
?
?
//isKindOfClass的用法
BOOL b = ?[o2 isKindOfClass:[ObjectTest class]];
if (b == YES) {
? ? NSLog(@"o2是ObjectTest类的对象");
}
?
?
? ? 7.-(BOOL)isMemberOfClass:(Class)aClass; ?只能判断摸个实例是否属于某个类,不能判断是否属于某个父类;
?
?
//isMemberOfClass
BOOL result = [o2 isMemberOfClass:[NSObject class]];
if (result == NO) {
? ? NSLog(@"isMemberOfClass不能判断是否为NSObject子类的对象");
}
?
?
? ? 8.-(NSString *) description; 返回字符串形