多态是基于继承而言的,例如自定义父类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 阅读( ...) 评论( ...)