iOS 动态类型isKindOfClass, isMemberOfClass

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

这些知识是看别的博主写的,然后自己理解再写一遍。

新建两个类,Person,Teacher。Teacher继承与Person。

1.Person类

[objc]  view plain copy
  1. //  
  2. //  Person.h  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface Person : NSObject  
  12. @property (nonatomicstrongNSString *name;  
  13. -(void)setName:(NSString *)name;  
  14. @end  

[objc]  view plain copy
  1. //  
  2. //  Person.m  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import "Person.h"  
  10.   
  11. @implementation Person  
  12.   
  13. -(void)setName:(NSString *)name{  
  14.       
  15.       
  16.     self.name = name;  
  17.       
  18. }  
  19. @end  


2.新建Teacher类

[objc]  view plain copy
  1. //  
  2. //  Teacher.h  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import "Person.h"  
  10.   
  11. @interface Teacher : Person  
  12.   
  13. -(void)teach;  
  14. @end  

[objc]  view plain copy
  1. //  
  2. //  Teacher.m  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import "Teacher.h"  
  10.   
  11. @implementation Teacher  
  12. -(void)teach{  
  13.       
  14.     NSLog(@"我是教数学的");  
  15. }  
  16. @end  

3.Students类

[objc]  view plain copy
  1. //  
  2. //  Students.h  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface Students : NSObject  
  12. -(void)learning;  
  13. @end  

[objc]  view plain copy
  1. //  
  2. //  Students.m  
  3. //  iOS动态类型  
  4. //  
  5. //  Created by 987trip_dev_mac on 15/6/16.  
  6. //  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.  
  7. //  
  8.   
  9. #import "Students.h"  
  10.   
  11. @implementation Students  
  12. -(void)learning{  
  13.   
  14.       
  15.     NSLog(@"我是学生,我爱学习");  
  16.       
  17. }  
  18. @end  



在控制器上实例化

[objc]  view plain copy
  1. /** 
  2.         Person,Teacher这两个类。Teacher是继承与Person。 
  3.      */  
  4.     Person *person = [[Person alloc]init];  
  5.     Teacher *teacher = [[Teacher alloc]init];  



判断对象类类型

- (BOOL)isKindOfClass:(Class)aClass;isKindOfClass是检测属不属于这个类的子类。就算是继承都是可以检测出来

- (BOOL)isMemberOfClass:(Class)aClass;isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。

[objc]  view plain copy
  1. /** 
  2.         Person,Teacher这两个类。Teacher是继承与Person。 
  3.      */  
  4.     Person *person = [[Person alloc]init];  
  5.     Teacher *teacher = [[Teacher alloc]init];  
  6.       
  7.     //isMemberOfClass方法。  
  8.     if ([teacher isMemberOfClass:[Teacher class]]) {  
  9.           
  10.         NSLog(@"teacher Teacher类的成员");  
  11.     }  
  12.       
  13.     if ([teacher isMemberOfClass:[Person class]]) {  
  14.         NSLog(@"teacher Person类的成员");  
  15.     }  
  16.       
  17.     if ([teacher isMemberOfClass:[NSObject class]]) {  
  18.           
  19.         NSLog(@"teacher NSObject类的成员");  
  20.     }  
  21.     //只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。  
  22.       
  23.     //isKindOfClass方法  
  24.     if ([teacher isKindOfClass:[Teacher class]]) {  
  25.           
  26.         NSLog(@"teacher 是 Teacher类或Teacher的子类");  
  27.     }  
  28.       
  29.     if ([teacher isKindOfClass:[Person class]]) {  
  30.         NSLog(@"teacher 是 Person类或Person的子类");  
  31.     }  
  32.       
  33.     if ([teacher isKindOfClass:[NSObject class]]) {  
  34.           
  35.         NSLog(@"teacher 是 NSObject类或NSObject的子类");  
  36.     }  
  37.     // isKindOfClass 是检测属不属于这个类的子类。就算是继承都是可以检测出来  

判断实例是否有这个方法

- (BOOL)respondsToSelector:(SEL)aSelector;判断实例是否有这样方法

[objc]  view plain copy
  1. if ([person respondsToSelector:@selector(setName:)]==YES) {  
  2.           
  3.         NSLog(@"Person 有这个方法 setName");  
  4.           
  5.     }  
  6.     if ([Teacher respondsToSelector:@selector(alloc)]==YES) {  
  7.           
  8.         NSLog(@"Teacher 有这个方法 alloc");  
  9.           
  10.     }  

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;判断类是否有这个方法。此方法是类方法,不能用在类的对象

[objc]  view plain copy
  1. if ([Person instancesRespondToSelector:@selector(teach)]==YES) {  
  2.          
  3.        NSLog(@"Person 有这个方法 ");  
  4.    }  
  5.      
  6.    if ([Teacher instancesRespondToSelector:@selector(teach)]==YES) {  
  7.          
  8.        NSLog(@"Teacher 有这个teach方法");  
  9.    }  
  10.      
  11.    if ([Teacher instancesRespondToSelector:@selector(setName:)]==YES) {  
  12.          
  13.        NSLog(@"Teacher 有这个setName方法");  
  14.    }  


1. NSClassFromString

  这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;

  优点:

1, 弱化连接,因此并不会把没有的Framework也link到程序中。

2,不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

[objc]  view plain copy
  1. //动态加载实例  
  2.     //NSClassFromString(<#NSString *aClassName#>)  
  3.     //这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;  
  4.       
  5.     id student = [[NSClassFromString(@"Students") alloc]init];  
  6.     if ([student isMemberOfClass:[NSClassFromString(@"Students") class]]) {  
  7.           
  8.         NSLog(@"存在 Students 这个类");  
  9.     }  
  10.       
  11.     //等价于  
  12.     id students = [[Students alloc]init]  



NSSelectorFromString

 这个方法是上个方法的补充,也是动态加载实例方法。

[objc]  view plain copy
  1. //动态加载实例的方法  
  2.     SEL sel = NSSelectorFromString(@"learning");  
  3.     if ([student respondsToSelector:sel]) {  
  4.           
  5.         [student performSelector:sel withObject:student];  
  6.         NSLog(@"存在这个方法");  
  7.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值