读李峰峰博客笔记之RunTime消息发送

2017-03-17  本文已影响9人  扑倒的柔情

消息

1、objc_msgSend

消息转发顺序

  1. 首先检测这个* selector *是不是要忽略,比如 Mac OS X 开发,有了垃圾回收就不理会 retain,release 这些函数。
/** 如果消息是传递给父类,那么会调用名字带有 Super 的函数,如果消息返回值是数据结构而不是简单值时,会调用名字带有 stret 的函数。 */
objc_msgSend
objc_msgSend_stret
objc_msgSendSuper
objc_msgSendSuper_stret

2、方法中的隐藏参数

3、获取方法的地址

/* 定义一个函数指针 */
void (*setter)(id, SEL, BOOL);
int i;
/* 给函数指针赋值 */
setter = (void (*)(id, SEL, BOOL))[target methodForSelector:@selector(setFilled:)];
/* 通过函数指针调用1000次这个方法 */
for ( i = 0 ; i < 1000 ; i++ ){
    setter(targetList[i], @selector(setFilled:), YES);
}

** 注意:上面用到的methodForSelector:方法是由 Runtime 系统提供的,而不是 Objc 自身的特性 **

上一篇 下一篇

猜你喜欢

热点阅读