动态类型判断
   (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>