对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。

判断对象类型

-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

新建Person和Teacher类

Person

//
//  Person.h
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSString *name;
}

-(void) setName:(NSString*) n;

@end

//
//  Person.m
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Person.h"

@implementation Person

-(void) setName:(NSString*) n {
    name = n;
}


@end

Teacher

//
//  Teacher.h
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Person.h"

//继承Person
@interface Teacher : Person

-(void) teach;

@end

//
//  Teacher.m
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher

-(void) teach {
    NSLog(@"%@教数学",name);
}
@end

isMemberOfClass

Person *person = [[Person alloc] init];
Teacher *teaher = [[Teacher alloc] init];
      
//1.isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管
//yes
if ([teaher isMemberOfClass:[Teacher class]]) {
  NSLog(@"teacher Teacher类的成员");
}
   
//no
if ([teaher isMemberOfClass:[Person class]]) {
  NSLog(@"teacher Person类的成员");
}
   
//no
if ([teaher isMemberOfClass:[NSObject class]]) {
  NSLog(@"teacher NSObject类的成员");
}

isKindOfClass

//2.isKindOfClass判断是否是其子类
//yes
if ([teaher isKindOfClass:[Teacher class]]) {
  NSLog(@"teacher 是Teacher类或子类");
}
   
//yes
if ([teaher isKindOfClass:[Person class]]) {
  NSLog(@"teacher 是Person类或子类");
}
   
//yes
if ([teaher isKindOfClass:[NSObject class]]) {
  NSLog(@"teacher 是NSObject类或子类");
}

判断对象方法

-(BOOL) respondsToSelector: selector 判读实例是否有这样方法
+(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法,不能用在类的对象

respondsToSelector

//3.respondsToSelector判断示例是否有这个方法
   
if ([teaher respondsToSelector:@selector(setName:)]) {
  NSLog(@"有此方法");
}
   
if ([teaher respondsToSelector:@selector(setAge)] == NO) {
  NSLog(@"无此方法");
}

instancesRespondToSelector

//4.instancesRespondToSelector判断类中是否有该方法,不能用在类的对象
   
if ([Person instancesRespondToSelector:@selector(setName:)]) {
  NSLog(@"Person 有此方法");
}
   
if ([Teacher instancesRespondToSelector:@selector(teach)]) {
  NSLog(@"Teacher 有此方法");

}
   
if ([Teacher instancesRespondToSelector:@selector(setName:)]) {
  NSLog(@"Teacher 有此方法");
  
}

Objective-C的id类型

在 Objective-C 中,id类型类似于(void*) ,可以指向任何类的实例。而不需要强制转换。

Teacher *teaher = [[Teacher alloc] init];
id t = teaher;  //id指向Teacher类
[t setName:@"liuguoquan"];
[t teach];

刘涤生
243 声望29 粉丝

临渊羡鱼,不如退而结网。