本文仅是代码演练章节,具体关于OC的runtime机制还不是太了解,仅做参考;
//创建继承自NSObject类的People类
Class People = objc_allocateClassPair([NSObject class], "People", 0);
//将People类注册到runtime中
objc_registerClassPair(People);
//注册方法选择器
SEL sel = sel_registerName("test:"); //@selector(test:)
//注册函数实现部分
IMP imp = imp_implementationWithBlock(^(id this, id args, ...) {
NSLog(@"方法的调用者为 %@",this);
NSLog(@"参数为 %@",args);
return @"返回值测试";
});
//向People类中添加 test:方法, 函数签名为@@:@
/*
第一个@表示返回值类型为id,
第二个@表示的是函数的调用者类型,
第三个:表示 SEL
第四个@表示需要一个id类型的参数
*/
class_addMethod(People, sel, imp, "@@:@");
//替换People从NSObject类中继承而来的description方法
class_replaceMethod(People, @selector(description), imp_implementationWithBlock(^NSString*(id this,...){
return @"我是Person类的对象";
}), "@@:");
//完成 [[People alloc]init];
id people = objc_msgSend(objc_msgSend(People, @selector(alloc)), @selector(init));
//调用people的sel选择器的方法,并传递@"???"作为参数
id result = objc_msgSend(people, sel, @"???");
//输出sel方法的返回值
NSLog(@"sel 方法的返回值为 : %@",result);
//获取People类中实现的方法列表
unsigned int method_count; //记录数
Method *methods = class_copyMethodList(People, &method_count);
for (unsigned int i = 0; i < method_count; i ++) {
NSLog(@"方法名称: %s",sel_getName(method_getName(methods[i])));
NSLog(@"方法类型: %s", method_getDescription(methods[i])->types);
}
注:关于解决objc_msgSend报错问题请看 上一篇文章
网友评论