Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等

转自:著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

原创链接:http://blog.csdn.net/totogo2010/article/details/7714960/#

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

判断对象类型

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

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

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

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

1.1、新建Person类

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject
  3. {
  4. NSString *name;
  5. }
  6. -(void)setName:(NSString*)n;
  7. @end

[cpp] view plaincopy

  1. #import "Person.h"
  2. @implementation Person
  3. -(void)setName:(NSString *)n
  4. {
  5. name = n;
  6. }
  7. @end

1.2新建Teacher类

[cpp] view plaincopy

  1. #import "Person.h"
  2. @interface Teacher : Person
  3. -(void)teach;
  4. @end

[cpp] view plaincopy

  1. #import "Teacher.h"
  2. @implementation Teacher
  3. -(void)teach
  4. {
  5. NSLog(@"我教数学");
  6. }
  7. @end

1.3 我们先实验下isMemberOfClass方法。

[cpp] view plaincopy

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  2. Person *person = [[Person alloc] init];
  3. Teacher *teacher = [[Teacher alloc] init];
  4. //YES
  5. if ([teacher isMemberOfClass:[Teacher class]]) {
  6. NSLog(@"teacher Teacher类的成员");
  7. }
  8. //NO
  9. if ([teacher isMemberOfClass:[Person class]]) {
  10. NSLog(@"teacher Person类的成员");
  11. }
  12. //NO
  13. if ([teacher isMemberOfClass:[NSObject class]]) {
  14. NSLog(@"teacher NSObject类的成员");
  15. }
  16. [person release];
  17. [teacher release];
  18. [pool release];

打印结果:

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

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

1.4 isKindOfClass方法

[cpp] view plaincopy

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  2. Person *person = [[Person alloc] init];
  3. Teacher *teacher = [[Teacher alloc] init];
  4. //YES
  5. if ([teacher isKindOfClass:[Teacher class]]) {
  6. NSLog(@"teacher 是 Teacher类或Teacher的子类");
  7. }
  8. //YES
  9. if ([teacher isKindOfClass:[Person class]]) {
  10. NSLog(@"teacher 是 Person类或Person的子类");
  11. }
  12. //YES
  13. if ([teacher isKindOfClass:[NSObject class]]) {
  14. NSLog(@"teacher 是 NSObject类或NSObject的子类");
  15. }
  16. [person release];
  17. [teacher release];
  18. [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] view plaincopy

  1. // YES
  2. if ( [teacher respondsToSelector: @selector( setName: )] == YES ) {
  3. NSLog(@"teacher responds to setSize: method" );
  4. }
  5. // NO
  6. if ( [teacher respondsToSelector: @selector( abcde )] == YES ) {
  7. NSLog(@"teacher responds to nonExistant method" );
  8. }
  9. // YES
  10. if ( [teacher respondsToSelector: @selector( alloc )] == YES ) {
  11. NSLog(@"teacher class responds to alloc method\n" );
  12. }

打印结果:

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] view plaincopy

  1. // NO
  2. if ( [Person instancesRespondToSelector: @selector(teach)] == YES ) {
  3. NSLog(@"Person instance responds to teach method" );
  4. }
  5. // YES
  6. if ( [Teacher instancesRespondToSelector: @selector(teach)] == YES ) {
  7. NSLog(@"Teacher instance responds to teach method");
  8. }
  9. // YES
  10. if ( [Teacher instancesRespondToSelector: @selector(setName:)] == YES ) {
  11. NSLog(@"Teacher instance responds to setName: method" );
  12. }

打印结果:

[cpp] view plaincopy

  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] view plaincopy

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  2. Person *person = [[Person alloc] init];
  3. Teacher *teacher = [[Teacher alloc] init];
  4. id p = person;
  5. id t = teacher;
  6. [t setName:@"张三老师"];
  7. [t teach];
  8. [person release];
  9. [teacher release];
  10. [pool release];

打印结果:

[cpp] view plaincopy

    1. 2012-07-04 14:57:55.905 ObjectiveCTest[3085:f803] 张三老师 教数学
时间: 2024-11-08 14:03:18

Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等的相关文章

(转)Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等

本文转自http://blog.csdn.net/totogo2010/article/details/7714960 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 ps:本篇新建的类主要用于熟悉本篇内容设计,未考虑内存管理因素. 我们试试这两个方法的使用. 1.新建Per

IOS动态类型isKindOfClass, isMemberOfClass

对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 我们试试这两个方法的使用. 1.新建Person类继承NSObject,新建Teacher类继承Person1.1.新建Person类1.#import <Foundation/Foundation.h>   2.  [ema

Objective-C中的多态、点语法和动态类型总结

一. 多态 1. 多态概念,定义 什么是多态:多态就是某一类事物的多种形态: 表现形式:  Animal *ani = [Dog new]; 多态条件:1.有继承关系     2.有方法的重写 2.多态代码实现: //实例化猫的对象 Animal *animal  = [Cat new]; //父类的指针指向子类对象: [animal eat]; //实例化狗的对象 animal = [Dog new]; //父类的指针指向子类对象. [animal eat]; 3.多态注意点: 1) 如果存在

点语法和动态类型

点语法: 对象.属性名 注意:此时并不是直接访问实例变量,而是xcode看到点语法后,会自动替换成[p setAge: 18]方法, 当出现在左侧时则替换为[p age]的get方法 不能使用self.age会出现死循环 20)@property: @property是编译器的指令,告诉编译器声明属性的访问器方法 @synthesize是实现@property声明的get和set方法 当类型一致时,可以用@property age,weight来定义属性方法 默认的是: setAge:(int)

Objective-C之成魔之路【11-多态性、动态类型和动态绑定】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 多态这个其它语言也有.动态类型有类似的,但不完全相同. 动态绑定别的语言也有类似,但没有objective-c用的这么多. 多态能够使来自不同类的对象定义相同名称的方法. 动态类型能使程序直到执行时才确定对象所属的类. 动态绑定则能使程序直到执行时才确定实际要调用的对象方法. 多态性是指在父类中定义的成员变量和

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [点语法] 1 1.使用“点语法” 2 Student *stu= [[Student alloc]init]; 3         //调用set方法 4         [stu setAge:20]; 5         [stu setName:@"Jone"]; 6         //点语法:xcode的特性,Xcode帮我们做了代码替换 7         //点语法,

OC 动态类型,动态绑定,动态加载

Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) 动态加载(Dynamic loading) 动态类型:程序直到执行时才能确定所属的类. id 数据类型id 通用的对象类型,可以存储任意类型的对象,id后面没有号,它本身就是个指针类似于void ,但只可以指向对象类型 静态类型与动态类型 编译期检查与运行时检查 静态类型在编译期就能检查出错误 静态类型声明代码可读性好 动态类型只有在

OC多态,动态类型绑定

// //  main.m //  OC7类 // //  Created by Zoujie on 15/8/23. //  Copyright (c) 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h"//导入头文件 #import "Complex.h" #define Choose  0 int main(int 

iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类定义.这是因为Objective-C的运行时系统在执行方法时知道消息的接收者是哪个类的对象,它总是携带有关“一个对象属于哪个类”这样的信息,该信息能使系统在运行时做出决定,而不是在编译时. 动态绑定和id类型 id数据类型是一种通用的对象类型,可以用来存储属于任何类的对象.当使用id类型的时候,程序