消息分派器

Objective-C运行时的核心就在于消息分派器objc_msgSend

实现简单的消息分派器。以下代码用C编写,为了证明Objective-C运行时真的只是C。

static const void *myMsgSend(id receiver, const char *name) {
    SEL selector = sel_registerName(name);
    IMP methodIMP = class_getMethodImplementation(object_getClass(receiver), selector);
    return methodIMP(receiver, selector);
}

void RunMyMsgSend() {
    // NSObject *object = [[NSObject alloc] init];
    Class class = (Class)objc_getClass("NSObject");
    id object = class_createInstance(class, 0);
    myMsgSend(object, "init");
    
    // id description = [object description];
    id description = (id)myMsgSend(object, "description");
    
    // const char * cstr = [description UTF8String];
    const char *cstr = myMsgSend(description, "UTF8String");
    
    printf("%s\n",cstr);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,822评论 0 9
  • objc_getAssociatedObject返回与给定键的特定对象关联的值。ID objc_getAssoci...
    有一种再见叫青春阅读 5,570评论 0 7
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 6,445评论 0 9
  • 忙了一阵子,今天验收完算法实验,忙里偷闲,心情不错。有一种不可名状的轻松感,很享受这种感觉,惬意里透露着一种真实,...
    梦泽之安阅读 1,891评论 1 1
  • 1.太差的沟通无结果,尽量不要正面硬刚,尽量直接做他们想要的结果. 2.一切只能用事实来证明。不能废话。 3.吵架...
    智囊团阅读 1,352评论 0 0