美文网首页
初识runtime,message

初识runtime,message

作者: __life__ | 来源:发表于2017-10-25 14:07 被阅读0次

    本文仅是代码演练章节,具体关于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报错问题请看 上一篇文章

    相关文章

      网友评论

          本文标题:初识runtime,message

          本文链接:https://www.haomeiwen.com/subject/jreqpxtx.html