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
- iOS 动态类型isKindOfClass, isMemberOfClass 初认识
- IOS动态类型isKindOfClass, isMemberOfClass
- IOS动态类型isKindOfClass, isMemberOfClass
- iOS 动态类型isKindOfClass, isMemberOfClass
- iOS开发之----动态类型(isKindOfClass, isMemberOfClass,id)等
- iOS开发之----动态类型(isKindOfClass, isMemberOfClass,id)等
- 动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C动态类型(isKindOfClass,isMemberOfClass)
- 动态类型判断...| -isKindOfClass: -isMemberOfClass: +isSubclassOfClass
- [iOS]isKindOfClass、isMemberOfClass、isSubclassOfClass
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十五:JAAS(二):JAAS类和接口
- SpringMVC实现工作原理
- unity 场景编辑器中 获取点击的物体
- maven错误解决办法
- [Object-C]关于 UiView添加边框和设置边框的颜色
- iOS 动态类型isKindOfClass, isMemberOfClass 初认识
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十六:JAAS(三):JAAS编程模型
- STL学习笔记之容器--slist
- myeclipse or eclipse maven 项目使用tomcat:run运行报错 用tomcat:run-war正常
- Java WebService 简单实例、调用第三方提供的webService服务
- IntelliJ Idea 常用快捷键列表
- 用python map函数实现pharmdock并行运算
- maven生成部署包需要注意的地方
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十七:JGSS(一):JGSS架构介绍