- ** 如果我们使用关键字 @dynamic 在类的实现文件中修饰一个属性,表明我们会为这个属性动态提供存取方法,编译器不会再默认为我们生成这个属性的 setter 和 getter 方法了,需要我们自己提供 **
- 当 Runtime 系统在 Cache 和类的方法列表(包括父类)中找不到要执行的方法时,Runtime 会调用一下两个方法来给我们一次动态添加方法实现的机会:
/* 添加实例方法 */
resolveInstanceMethod:
/* 添加类方法 */
resolveClassMethod:
/* 完成向特定类添加特定方法实现的操作 */
class_addMethod
- 下面的例子为 resolveThisMethodDynamically 方法添加了实现内容,就是 dynamicMethodIMP 方法中的代码。其中 “v@:” 表示返回值和参数。示例代码:
void dynamicMethodIMP(id self, SEL _cmd)
{
// implementation ....
}
@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(resolveThisMethodDynamically))
{
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
@end
- ** 注意:动态方法解析会在* 消息转发机制侵入前 *执行 **
- ** 动态方法解析器将会首先给予提供该方法选择器对应的 IMP 的机会。如果你想让该方法选择器被传送到转发机制,就让 resolveInstanceMethod: 方法返回 NO。 **