iOS基础知识之多态问题
2017-02-25 14:48
239 查看
多态是基于继承而言的,例如自定义父类Person,子类Son,那么可能会出现如下情况:
这种情况时,便是多态的使用。多态属于动态创建对象,分为两个步骤:1.确定当前对象的类型。2.动态绑定。
如果调用调用Son类中实现而其父类中并未实现的方法,便会出现问题。
因此为了避免出现由于使用多态而导致的问题,可以通过几种方法认为的规避错误,具体方法如下:
1.使用isMemberOfClass:方法判断当前对象是否是指定类的对象。注意:Foundition框架中的NSArray,NSString等不能使用isMemberOfClass方法。
2.使用isKindOfClass:方法判断当前对象指定类的对象或者其子类对象。
3.使用respondsToSelector:判断对象是否能相应指定方法。
4.使用instancesRespondToSelector:方法判断配个类是否实现了指定方法:注意只在.h文件中声明了方法,没有实现,则instancesRespondToSelector:返回NO。
5.使用performSelector:隐士调用方法,即只在.m文件中实现了方法,并未在.h中声明。
自定义Person类,.h类具体代码如下:
.m类如下:
主方法调用如下:
1 Person *p =[ [Son alloc]init];
这种情况时,便是多态的使用。多态属于动态创建对象,分为两个步骤:1.确定当前对象的类型。2.动态绑定。
如果调用调用Son类中实现而其父类中并未实现的方法,便会出现问题。
因此为了避免出现由于使用多态而导致的问题,可以通过几种方法认为的规避错误,具体方法如下:
1.使用isMemberOfClass:方法判断当前对象是否是指定类的对象。注意:Foundition框架中的NSArray,NSString等不能使用isMemberOfClass方法。
2.使用isKindOfClass:方法判断当前对象指定类的对象或者其子类对象。
3.使用respondsToSelector:判断对象是否能相应指定方法。
4.使用instancesRespondToSelector:方法判断配个类是否实现了指定方法:注意只在.h文件中声明了方法,没有实现,则instancesRespondToSelector:返回NO。
5.使用performSelector:隐士调用方法,即只在.m文件中实现了方法,并未在.h中声明。
自定义Person类,.h类具体代码如下:
1 @interface Person : NSObject 2 3 @property (nonatomic, copy)NSString *name; 4 5 @property (nonatomic, assign)NSInteger age; 6 7 - (void)smaller; 8 @end
.m类如下:
1 @implementation Person 2 3 - (void)smaller { 4 _age --; 5 NSLog(@"年龄减少一岁"); 6 7 } 8 - (void)growUp { 9 _age ++; 10 11 NSLog(@"年龄增长一岁"); 12 } 13 @end
主方法调用如下:
1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 //1.判断对象是什么类型 4 id p = [[Person alloc]init]; 5 6 //判断p是否是Person的对象 7 if([p isMemberOfClass:NSClassFromString(@"Person")]) { 8 NSLog(@"Person 对象 "); 9 }else { 10 NSLog(@"Person not "); 11 } 12 13 //2.判断p是否是Person的对象或者其子类对象 14 if([p isKindOfClass:NSClassFromString(@"Person")]) { 15 NSLog(@"Person 对象 或者其子类对象"); 16 } else { 17 NSLog(@"不是Person 对象 或者其子类对象"); 18 } 19 //3.NSArray,NSString等不能使用isMemberOfClass方法 20 21 //4.判断对象是否能相应指定方法 22 if ([p respondsToSelector:@selector(length)]) { 23 NSLog(@"Person 对象能响应length方法"); 24 }else { 25 NSLog(@"Person 对象不能响应length方法"); 26 } 27 28 //5.判断配个类是否实现了指定方法:注意只在.h文件中声明了方法,没有实现,则instancesRespondToSelector:返回NO 29 if ([Person instancesRespondToSelector:@selector(smaller)]) { 30 NSLog(@"Person 实现了smaller方法"); 31 }else { 32 NSLog(@"Person 没有实现smaller方法"); 33 } 34 35 //6.隐士调用方法,即只在.m文件中实现了方法,并未在.h中声明 36 [p performSelector:@selector(growUp)]; 37 } 38 return 0; 39 }
相关文章推荐
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- 通过plsql 测试存储过程遇到的问题和学习到的一些基础知识整理
- ios开发基础知识 - 2
- 面试问题:专业基础知识,软件工程知识,英语水平,实践能力
- VC++基础知识——Edit的赋值取值问题!
- C#基础系列问题三委托知识总结1
- 基础知识提问:关于HashTable和List两个容器Add改变了属性的同一对象的问题
- ios开发基础知识 - 1
- 【DICOMDIR专题】DICOMDIR基础知识及常见问题汇总
- 问题分析--网络基础知识+.NET基础知识
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- 数据库一些基础知识汇总<键类问题小结>
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- 软件测试常见问题——(一)基础知识部分(转贴)
- 《软件测试管理》第14章 软件测试常见问题——(一)基础知识部分
- unix core 问题定位-基础知识
- 常见PACS问题30问【PACS基础知识普及贴】
- 【DICOMDIR专题】DICOMDIR基础知识及常见问题汇总