iOS多态:初始化时效果出不来?可能是因为覆盖了父类的同名方法
2017-01-18 15:31
218 查看
首先说下多态,最直观的理解就是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多态和运行时机制是非常重要的!
相信大家在实际写代码过程中也有类似的发现,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多态和运行时机制是非常重要的!
相关文章推荐
- PostgreSQL教程(三):表的继承和分区表详解
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- C#中的多态深入理解
- C#中多态、重载、重写区别分析
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C++实现不能被继承的类实例分析
- 浅谈C++继承中的名字查找
- 有关C++继承与友元、继承与类型转换详解
- C# 面向对象三大特性:封装、继承、多态
- PHP类的封装与继承详解
- js继承 Base类的源码解析
- Javascript 面向对象 继承
- JavaScript 继承使用分析
- Javascript面向对象编程(二) 构造函数的继承
- PHP面向对象程序设计OOP继承用法入门示例
- 封装与继承
- Java总结(九)——(线程模块 一(线程的创建(方法一)与启动,线程状态与生命周期,进程与线程))