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