Objective-C 中基于RunTime实现的反射
一、反射
反射,一般表现在字符串和Class转换,字符串和内部方法转换,字符串和属性的转换(取值和赋值)。
二、Objective-C中的反射
OC的反射是基于其Runtime实现的。
以执行某个函数为例,我们知道在OC中执行[pyPerson doSomething]函数,实质上是发送了一个消息给Runtime,然后Runtime再根据这个Class的字符串名和这个函数的字符串名,去匹配真正相应的方法的地址,然后再执行的。所以中间我们可以利用字符串去动态的检测,甚至动态的修改(之前说到的Method Swizzling)。
在OC中,很多Runtime的动态特性的接口大致都已经在NSObject.h中声明,可以自己看下源码。
1.字符串和Class转换,及判断
Class __nullable NSClassFromString(NSString *aClassName);
-(BOOL)isKindOfClass:(Class)aClass;
-(BOOL)isMemberOfClass:(Class)aClass;
example:
//通过这样的方式获取class
Class Person = NSClassFromString(@"PYPerson");
PYPerson *person= [[Person alloc] init];
//判断是否为其子类的对象
PYPerson *person= [[PYPerson alloc] init];
if([personisKindOfClass:[PYStudent class]]){ PY
一、反射
反射,一般表现在字符串和Class转换,字符串和内部方法转换,字符串和属性的转换(取值和赋值)。
二、Objective-C中的反射
OC的反射是基于其Runtime实现的。
以执行某个函数为例,我们知道在OC中执行[pyPerson doSomething]函数,实质上是发送了一个消息给Runtime,然后Runtime再根据这个Class的字符串名和这个函数的字符串名,去匹配真正相应的方法的地址,然后再执行的。所以中间我们可以利用字符串去动态的检测,甚至动态的修改(之前说到的Method Swizzling)。
在OC中,很多Runtime的动态特性的接口大致都已经在NSObject.h中声明,可以自己看下源码。
1.字符串和Class转换,及判断
Class __nullable NSClassFromString(NSString *aClassName);
-(BOOL)isKindOfClass:(Class)aClass;
-(BOOL)isMemberOfClass:(Class)aClass;
example:
//通过这样的方式获取class
Class Person = NSClassFromString(@"PYPerson");
PYPerson *person= [[Person alloc] init];
//判断是否为其子类的对象
PYPerson *person= [[PYPerson alloc] init];
if([personisKindOfClass:[PYStudent class]]){ PY