Objective-C 的动态类型判断

动态类型判断
   (1).在Objective-C中,一个对象是否调用指定的方法不是有编译器决定的,而是由运行时决定的
       这被称作为动态绑定
   
   (2).在OC中,对象不调用方法,而是接受消息,消息表达式为:[reciver message];
       运行时首先确定接收的类型(动态类型识别),然后根据消息名在类的方法列表里选择相依的
       方法执行,所以在源代码里消息也成为选择器(selector)
   
   动态类型检测方法
   (1). 判断类型
        -(BOOL) isKindOfClass : classObj     判断实例对象是否是这个类的实例,子类也可以
        -(BOOL) isMemberOfClass : classObj   判断实例对象是否是这个类的实例,不包括子类,只能检测当前类
        -(BOOL) isSubclassOfClass : classObj 判断实例独享是否是这个类的子类的实例
    
    示例代码:

     
<span style="font-size:14px;">#import <Foundation/Foundation.h>

//动物类
@interface Animal : NSObject
{    
}
-(void)run;
@end

@implementation Animal
-(void)run{
    NSLog(@"动物在跑!");
}
@end

//狗类
@interface Dog : NSObject
{    
}
-(void)run;
@end

@implementation Dog
-(void)run{
    NSLog(@"狗在跑!");
}
@end

//人类
@interface Person : NSObject
@end
@implementation Person
@end

//以下是动态类型检测
int main(int argc,const char * argv[]){
    //以下讲述isKindOfClass
    Animal *animal = [Animal new];
    //变量aninmal是否是Animal类的实例对象, 输出1  是它的实例
    BOOL isKind = [animal isKindOfClass : [Animal class]];
    
    Dog *dog = [Dog new];
    //变量dog是否是Animal类的实例对象,输出1,dog是Animal子类的实例
    BOOL dogInstance = [dog isKindOfClass : [Animal class]];
    
    Person *p = [Person new];
    //变量p是否是Animal类的实例对象,输出0,p不是Animal的实例对象
    BOOL pInstance = [p isKindOfClass : [Animal class]];
    
    
    //以下讲述isMemberOfClass
    Animal *animal2 = [Animal new];
    //animal2是Animal类的实例, 是 输出1
    BOOL isAni2 = [animal2 isMemberOfClass : [Animal class]];
    
    Dog *dog2 = [Dog new];
    //dog2不是Animal类的实例,因为Dog是Animal的子类,输出0
    BOOL isDog2 = [dog2 isMemberOfClass : [Animal class]];
    
    
    //以下讲述isSubclassOfClass
    Animal *animal3 = [Animal new];
    //ani3不是Animal的子类的实例,输出0
    BOOL ani3 = [[animal3 Animal] isSubclassOfClass : [Animal class]];
    
    //dog3是Animal类的子类的实例,输出1
    BOOL isDog3 = [Dog isSubclassOfClass : [Animal class]];
    
    Dog *dog4 = [Dog new];
    //变量[dog4 class]是Animal的子类 输出1
    BOOL isDog4 = [[dog4 class] isSubclassOfClass : [Animal class]];
    
    //Dog类是Animal类的子类,输出1
    BOOL isSub = [Dog isSubclassOfClass : [Animal class]];
    
    return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值