首先说下多态,最直观的理解就是OC种的数组!分为两种,一种是NSArray,一种是NSMutableArray,前者是后者的父类!
相信大家在实际写代码过程中也有类似的发现,NSArray可以接收NSMutableArray产生的对象,而反过来不可以,这就是多态!
也就是说多态就是父类指针可以指向子类指针!
然后今天在码完代码开始测试时,发现button的titleColor效果一直出不来,各种检查都没有查出来问题!
最后在打了N个断点后发现我的button是通过继承自UIButton的MyButton中继承过来的,而在MyButton初始化时为了代码清晰,
我使用了下面的处理
#import <UIKit/UIKit.h>
@interface MyButton : UIButton
@end
- (instancetype)init{
if (self = [super init]) {
[self setup];
}
return self;
}
- (void)setup{
// 初始化时设置,可以加载一些主题风格
}
然后我再button初始化的时候也采取了同样的方式
#import <UIKit/UIKit.h>
@interface SubButton : MyButton
@end
- (instancetype)init{
if (self = [super init]) {
[self setup];
}
return self;
}
- (void)setup{
// 初始化时设置,可以在具体使用时加载具体不同的style
}
然后就跳进坑里了!
因为子类重写了父类里面的同名方法,而由于多态的关系,在父类调用setup的时候,self指向的是SubButton对象,所以最后调用的依然是SubButton的setup方法!
所以最后父类初始化时的setup就这样被忽视了!
因为子类不需要设置全部效果,所以看起来很明显效果不同,非常容易察觉出错,但是一些非直观效果的这类错误没有经验很难查找...
总结经验:事实上,深入理解iOS多态和运行时机制是非常重要的!