iOS 动态类型isKindOfClass, isMemberOfClass 初认识

来源:互联网 发布:袁隆平 转基因 知乎 编辑:程序博客网 时间:2024/06/06 02:57

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

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

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

1.Person类

////  Person.h//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, strong) NSString *name;-(void)setName:(NSString *)name;@end

////  Person.m//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import "Person.h"@implementation Person-(void)setName:(NSString *)name{            self.name = name;    }@end


2.新建Teacher类

////  Teacher.h//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import "Person.h"@interface Teacher : Person-(void)teach;@end

////  Teacher.m//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import "Teacher.h"@implementation Teacher-(void)teach{        NSLog(@"我是教数学的");}@end

3.Students类

////  Students.h//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import <Foundation/Foundation.h>@interface Students : NSObject-(void)learning;@end

////  Students.m//  iOS动态类型////  Created by 987trip_dev_mac on 15/6/16.//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.//#import "Students.h"@implementation Students-(void)learning{        NSLog(@"我是学生,我爱学习");    }@end



在控制器上实例化

/**        Person,Teacher这两个类。Teacher是继承与Person。     */    Person *person = [[Person alloc]init];    Teacher *teacher = [[Teacher alloc]init];



判断对象类类型

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

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

/**        Person,Teacher这两个类。Teacher是继承与Person。     */    Person *person = [[Person alloc]init];    Teacher *teacher = [[Teacher alloc]init];        //isMemberOfClass方法。    if ([teacher isMemberOfClass:[Teacher class]]) {                NSLog(@"teacher Teacher类的成员");    }        if ([teacher isMemberOfClass:[Person class]]) {        NSLog(@"teacher Person类的成员");    }        if ([teacher isMemberOfClass:[NSObject class]]) {                NSLog(@"teacher NSObject类的成员");    }    //只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。        //isKindOfClass方法    if ([teacher isKindOfClass:[Teacher class]]) {                NSLog(@"teacher 是 Teacher类或Teacher的子类");    }        if ([teacher isKindOfClass:[Person class]]) {        NSLog(@"teacher 是 Person类或Person的子类");    }        if ([teacher isKindOfClass:[NSObject class]]) {                NSLog(@"teacher 是 NSObject类或NSObject的子类");    }    // isKindOfClass 是检测属不属于这个类的子类。就算是继承都是可以检测出来

判断实例是否有这个方法

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

if ([person respondsToSelector:@selector(setName:)]==YES) {                NSLog(@"Person 有这个方法 setName");            }    if ([Teacher respondsToSelector:@selector(alloc)]==YES) {                NSLog(@"Teacher 有这个方法 alloc");            }

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

 if ([Person instancesRespondToSelector:@selector(teach)]==YES) {                NSLog(@"Person 有这个方法 ");    }        if ([Teacher instancesRespondToSelector:@selector(teach)]==YES) {                NSLog(@"Teacher 有这个teach方法");    }        if ([Teacher instancesRespondToSelector:@selector(setName:)]==YES) {                NSLog(@"Teacher 有这个setName方法");    }


1. NSClassFromString

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

  优点:

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

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

//动态加载实例    //NSClassFromString(<#NSString *aClassName#>)    //这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;        id student = [[NSClassFromString(@"Students") alloc]init];    if ([student isMemberOfClass:[NSClassFromString(@"Students") class]]) {                NSLog(@"存在 Students 这个类");    }        //等价于    id students = [[Students alloc]init]



NSSelectorFromString

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

//动态加载实例的方法    SEL sel = NSSelectorFromString(@"learning");    if ([student respondsToSelector:sel]) {                [student performSelector:sel withObject:student];        NSLog(@"存在这个方法");    }










0 0
原创粉丝点击