写在前面
再有俩小时不到就国庆了,八天假期实在美滋滋,搞得现在一点上班的心思都没了,也因为现在app没什么好修改的了,闲着无聊就测试下在OC中继承与Category
的方法调用的优先级。
(之所以选择测试继承与Category
,是因为这部分知识比较简单,大家都学过,用来打发时间是比较合适的)
OC的三大特性:封装
、继承
、多态
,使用继承的好处大家也都很了解了:实现代码的复用
、对问题的统一处理
等等。
目的:测试继承和延展的方法调用优先级
我这里创建了四个类,ClassA、ClassB、ClassC、ClassD
,其中ClassA
继承自NSObject
,ClassD
继承自C
,C
继承自B
,B
继承自A
,又写了一个NSObject
的延展NSObject + Class
,各自声明和实现了方法 + (void)logMessage;
+ (void)logMessage
{
NSLog(@"this is category / classA / ClassB / ClassC / ClassD method ----");
}
在控制器导入四个类和延展,页面有四个按钮(ClassA
、ClassB
、ClassC
、ClassD
),点击方法分别调用各类的方法
- (IBAction)classA:(id)sender {
[ClassA logMessage];
}
- (IBAction)classB:(id)sender {
[ClassB logMessage];
}
- (IBAction)classC:(id)sender {
[ClassC logMessage];
}
- (IBAction)classD:(id)sender {
[ClassD logMessage];
}
一、测试父类是否会调用子类的方法
注释掉ClassA
中方法实现,保留.h
中的方法声明,注释掉NSObject+Class
中logMessage
方法的声明和实现,防止Category
的影响。
点击ClassA
按钮,不出意外的程序挂掉了,
reason
提示说ClassA
找不到logMessage
方法,说明父类并不会调用子类的方法
二、测试自身和父类方法的调用优先级
点击ClassB
按钮,查看打印信息为
InheritDemo[25434:811698] this is ClassB method ----
说明自身的方法优先于父类被调用
三、测试自身和 category
方法调用优先级
导入ClassA + Class
文件,并实现logMessage
方法,
点击ClassA
按钮, 查看打印信息为
InheritDemo[25434:811698] this is ClassA category method ----
说明** Category
方法的调用优先于自身的方法调用**
四、测试自身和父类的Category
的优先级
注释掉ClassB + Category
中的方法声明和实现,点击ClassB
按钮,查看打印信息,看ClassB
是调用ClassA category
(也就是其父类的category
)中的方法还是ClassB
中的方法。
控制台输出为:
InheritDemo[25476:817259] this is ClassB method----
说明ClassB
是调用了ClassB
(也就是自身)中的方法,也就是说明自身的方法调用会优于父类的category
方法被调用
总结:
- 方法调用顺序:自身
category
> 自身方法 > 父类的category
> 父类方法- 父类不会调用子类的方法
Category
会为类增加一个方法,而且会最优先调用