博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
阅读量:6852 次
发布时间:2019-06-26

本文共 4271 字,大约阅读时间需要 14 分钟。

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

判断对象类型

-(BOOL) isKindOfClass: classObj

判断是否是这个类或者这个类的子类的实例/ 判断是否是这个类的实例

-(BOOL) isMemberOfClass: classObj

 

我们试试这两个方法的使用。

1、新建Person类继承NSObject,新建Teacher类继承Person

1.1、新建Person类

[cpp]
#import 
@interface Person : NSObject { NSString *name; } -(void)setName:(NSString*)n; @end

 

[cpp]
#import "Person.h"    @implementation Person  -(void)setName:(NSString *)n  {      name = n;  }    @end

1.2新建Teacher类

[cpp]
#import "Person.h"    @interface Teacher : Person    -(void)teach;    @end
 
[cpp]
#import "Teacher.h"    @implementation Teacher  -(void)teach  {      NSLog(@"我教数学");  }  @end

 1.3 我们先实验下isMemberOfClass方法

[cpp]
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     Person *person = [[Person alloc] init];     Teacher *teacher = [[Teacher alloc] init];          //YES     if ([teacher isMemberOfClass:[Teacher class]]) {          NSLog(@"teacher Teacher类的成员");     }     //NO     if ([teacher isMemberOfClass:[Person class]]) {         NSLog(@"teacher Person类的成员");     }     //NO     if ([teacher isMemberOfClass:[NSObject class]]) {         NSLog(@"teacher NSObject类的成员");     }     [person release];     [teacher release];     [pool release];

 

打印结果:

2012-07-04 14:23:07.965 ObjectiveCTest[2460:f803] teacher Teacher类的成员

只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。

1.4 isKindOfClass方法

[cpp]
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  Person *person = [[Person alloc] init];  Teacher *teacher = [[Teacher alloc] init];    //YES  if ([teacher isKindOfClass:[Teacher class]]) {      NSLog(@"teacher 是 Teacher类或Teacher的子类");  }  //YES  if ([teacher isKindOfClass:[Person class]]) {      NSLog(@"teacher 是 Person类或Person的子类");  }  //YES  if ([teacher isKindOfClass:[NSObject class]]) {      NSLog(@"teacher 是 NSObject类或NSObject的子类");  }  [person release];  [teacher release];  [pool release];

2012-07-04 14:34:17.315 ObjectiveCTest[2595:f803] teacher Teacher类或Teacher的子类

2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher Person类或Person的子类

2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher NSObject类或NSObject的子类

三个结果都打印出来了。

2、

判读实例是否有这样方法

-(BOOL) respondsToSelector: selector

判断类是否有这个方法。此方法是类方法,不能用在类的对象

+(BOOL) instancesRespondToSelector:

2.1 respondsToSelector的使用

这里不写对象的创建和释放了,参考上面的代码

[cpp]
// YES  if ( [teacher respondsToSelector: @selector( setName: )] == YES ) {      NSLog(@"teacher responds to setSize: method" );  }    // NO  if ( [teacher respondsToSelector: @selector( abcde )] == YES ) {      NSLog(@"teacher responds to nonExistant method" );  }    // YES  if ( [teacher respondsToSelector: @selector( alloc )] == YES ) {      NSLog(@"teacher class responds to alloc method\n" );  }

 

打印结果:

2012-07-04 14:39:49.853 ObjectiveCTest[2723:f803] teacher responds to setSize: method

2012-07-04 14:39:49.854 ObjectiveCTest[2723:f803] teacher class responds to alloc method

中间的那个判断我随便写了个selector,当然没有了。respondsToSelector 检查类方法 alloc返回YES

2.2 instancesRespondToSelector

[cpp]
// NO      if ( [Person instancesRespondToSelector: @selector(teach)] == YES ) {          NSLog(@"Person instance responds to teach method" );      }            // YES      if ( [Teacher instancesRespondToSelector: @selector(teach)] == YES ) {          NSLog(@"Teacher instance responds to teach method");      }      // YES      if ( [Teacher instancesRespondToSelector: @selector(setName:)] == YES ) {          NSLog(@"Teacher instance responds to setName: method" );      }

 

打印结果:

[cpp]
  1. 2012-07-04 14:52:29.378 ObjectiveCTest[2961:f803] Teacher instance responds to teach method  
  2. 2012-07-04 14:52:29.379 ObjectiveCTest[2961:f803] Teacher instance responds to setName: method  

 3、Objective-C的id类型

C++ 使用的是强类型:对象必须符合其类型,否则不能通过编译。在 Objective-C 中,id类型类似于(void*) ,可以指向任何类的实例。而不需要强制转换。

下面看看使用,

先把Teacher类中的 teach方法修改一下,改成

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

 

 

然后实现并调用

[cpp]
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  Person *person = [[Person alloc] init];  Teacher *teacher = [[Teacher alloc] init];    id p = person;  id t = teacher;  [t setName:@"张三老师"];  [t teach];    [person release];  [teacher release];  [pool release];

 

打印结果:

[cpp]
    1. 2012-07-04 14:57:55.905 ObjectiveCTest[3085:f803] 张三老师 教数学  

转载于:https://www.cnblogs.com/hero11223/p/5174998.html

你可能感兴趣的文章
Robot Framework自动化测试Selenium2Library库详细用法
查看>>
多线程间通信之AutoResetEvent和ManualResetEvent的原理分析和开发示例
查看>>
C#中 @ 的3种用途
查看>>
模板方法模式(Template Pattern)
查看>>
Instr() 函数
查看>>
hdu-acm steps Max sum
查看>>
Radar Installation
查看>>
组队项目四则运算成果
查看>>
使用UIPickerView显示数据
查看>>
java代码继承基础
查看>>
java继承实例基础
查看>>
数据库增删改查梳理
查看>>
linux下检测每个进程占用swap大小
查看>>
[转] 编译输出文件的区别
查看>>
Java MyBatis 插入数据库返回主键--insertSelective这样就不用每次到数据库里面查询了...
查看>>
springboot集成redis操作
查看>>
x64 QWORD Xor shellcode encoder
查看>>
大数据之mapreduce小实战
查看>>
Elasticsearch(二)
查看>>
一步一步学linq to sql(九)其他补充
查看>>