zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    BETA 版冲刺前准备
    alpha事后诸葛亮
    alpha冲刺10
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    alpha冲刺5
    第十一次作业
    Alpha冲刺一 (10/10)
  • 原文地址:https://www.cnblogs.com/calence/p/6441805.html
Copyright © 2011-2022 走看看