#import "ViewController.h"
#import <objc/runtime.h>
//#import "Cat.h"
#import "AnimalProtocol.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// [self simpleRuntime];
[selfsetupClassByRuntime];
[selfgetAllClass];
}
//MARK: - 3.获取内存中所有的OC类
- (void)getAllClass{
//类的数量
int numOfClasses;
// 存放指向第一个类的指针
Class *classes = NULL;
// 获取多少类
numOfClasses = objc_getClassList(NULL,0);
// 如果获取的类大于0
if (numOfClasses >0) {
//为获取所有的类开辟内存空间
classes = (Class *)malloc(sizeof(Class) *numOfClasses);
// 把所有类拷贝到我开的内存中
numOfClasses = objc_getClassList(classes, numOfClasses);
// 遍历所有的类
for (NSInteger i =0 ; i < numOfClasses; i++) {
Class cls = classes[i];
//打印所有的类
// NSLog(@"className : %@", NSStringFromClass(cls));
//方法一:通过类名检索需要找的类
// if ([NSStringFromClass(cls) isEqualToString:@"Dog"]) {
// NSLog(@"找到了Dog类:%@",cls);
// }
//方法二:通过协议来检索我们需要的类(面向协议编程,不再依赖.h.m文件,即使删除了文件,程序依然能够正常运行)
if (class_conformsToProtocol(cls,@protocol(AnimalProtocol))) {
NSLog(@"找到了遵守AnimalProtocol的类:%@",cls);
//创建一个遵守AnimalProtocol的对象
id <AnimalProtocol> instance = [[clsalloc]init];
//让对象实现这个协议的方法
[instance test];
}
}
//释放内存
free(classes);
}
}
//MARK: - 2. 运行如何添加一个类
- (void)setupClassByRuntime{
//设置类名
constchar * className = "Dog";
//通过类名获取类
Class dogClass = objc_getClass(className);
//如果类不能存在,就创建基类
if (!dogClass) {
Class superClass = [NSObjectclass];
dogClass = objc_allocateClassPair(superClass, className,0);
}
//注册这个类
objc_registerClassPair(dogClass);
//对类添加方法
IMP dogImp =imp_implementationWithBlock(^ (id _self,NSString *string){
NSLog(@"Hello:%@",string);
});
// @encode(float) 用这个关键字可以获取参数类型:这个block有无返回值及参数类型 (v:代表这个block没有返回值,@:代表self这个对象,@代表string这个oc对象(如果是float类型,就是f))
class_addMethod(dogClass,@selector(sayHello:), dogImp,"v@:@");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//创建类
Class dogClass = NSClassFromString(@"Dog");
//创建类对象
id dog = [[dogClassalloc]init];
//执行添加的方法
[dog performSelector:@selector(sayHello:)withObject:@"My name is heheda"];
}
//MARK: - 1. 最简单的运行时
- (void)simpleRuntime {
//1)导入头文件 #import <objc/runtime.h>
//2)创建类(.m.h文件),并设置属性
//3)运行的时候会创建这个类的对象并设置其属性
Class catClass = NSClassFromString(@"Cat");
id cat = [[catClassalloc]init];
[cat performSelector:@selector(setName:)withObject:@"coffee"];
NSLog(@"%@",[catvalueForKey:@"name"]);
}
@end
//源码链接:https://github.com/KimmyKing/simpleUsing-runtime.git