第一部分
objc_msgSend 这是Objective-C的方法调用的核心,它可调用一个类的所有方法,不管它有没有暴露出来。
例如:
TestObj.h 文件:
1 |
|
以下是调用示例:
1 |
|
第二部分
无论目标类有没有将方法暴露出来,一样可以同过运行时将它遍历出来,并可以找出方法的入参.
示例:
1 |
|
1 | 1. 方法的入参默认会有两个,这是系统运行时添加进去的。 |



第三部分
通过运行时,可以获取方法的变量,并且可以通过映射,动态修改变量名称,MJExtension 框架就是利用了这一特点,所以它可以通过MJExtensionConfig 文件来修改参数的映射。
参考:http://www.cnblogs.com/ludashi/p/4673935.html
示例:
1 |
|
第四部分
一个对象可以绑定任何一个对象,包括 block。
涉及到的方法如下:1
2
3
4
5objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) // 设置绑定对象
objc_getAssociatedObject(id object, const void *key) // 获得绑定对象
objc_removeAssociatedObjects(id object) // 移除绑定对象
绑定对象的时候,需要根据对象的属性,设置不同的关联策略,也就是Objc的内存管理的引用计数机制,包括有:1
2
3
4
5
6
7
8
9OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied.
OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object.
OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied.
示例代码:
1 |
|
第五部分
Method Swizzling,本身Objc的方法调用是通过消息转发机制来实现的,既然如此,就可以通过重新映射方法对应的实现来达到“偷天换日”的目的。跟消息转发相比,Method Swizzling 的做法更为隐蔽,甚至有些冒险,也增大了debug的难度。
代码示例:
1 |
|