iOS基础知识之多态问题

多态是基于继承而言的,例如自定义父类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 : 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 }

 

posted @ 2017-02-25 14:48  bky2016  阅读(926)  评论(0编辑  收藏  举报