博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS基础知识之多态问题
阅读量:5107 次
发布时间:2019-06-13

本文共 2248 字,大约阅读时间需要 7 分钟。

多态是基于继承而言的,例如自定义父类Person,子类Son,那么可能会出现如下情况:

 

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 : NSObject2 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:返回NO29         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 }

 

posted on
2017-02-25 14:48 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/calence/p/6441805.html

你可能感兴趣的文章
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
JSP:Cookie实现永久登录(书本案例)
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>