runtime系列3--Dynamic Method Resolution-方法的动态决议
2014-03-27 14:20
288 查看
本章介绍如何提供方法的动态决议
有时候我们想要为一个方法动态地提供实现,比如Objective-C的@dynamic指示符,它告诉编译器与属性对应的方法是动态提供的。
@dynamic propertyName;
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):
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
动态决议和发送消息并不冲突,在消息机制起作用之前,一个类是有机会动态决议一个方法的。当respondsToSelector:或者instancesRespondToSelector:被激活时,dynamic
method resolver会优先有个机会为这个selector提供一份实现。如果实现了resolveInstanceMethod:,对于不想动态决议而想让其遵循消息转发机制的selectors,返回NO即可。
Dynamic
Loading--动态加载
Objective-C程序可以在运行时链接新的类和category。动态加载可以用来做很多不同的事情,比如System Preferences里头各种模块就是动态加载的。尽管有运行时函数可以动态加载Objective-C模块(objc/objc-load.h中的objc_loadModules),但Cocoa的NSBundle类提供了更方便的动态加载接口。
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):
有时候我们想要为一个方法动态地提供实现,比如Objective-C的@dynamic指示符,它告诉编译器与属性对应的方法是动态提供的。
@dynamic propertyName;
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):
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
动态决议和发送消息并不冲突,在消息机制起作用之前,一个类是有机会动态决议一个方法的。当respondsToSelector:或者instancesRespondToSelector:被激活时,dynamic
method resolver会优先有个机会为这个selector提供一份实现。如果实现了resolveInstanceMethod:,对于不想动态决议而想让其遵循消息转发机制的selectors,返回NO即可。
Dynamic
Loading--动态加载
Objective-C程序可以在运行时链接新的类和category。动态加载可以用来做很多不同的事情,比如System Preferences里头各种模块就是动态加载的。尽管有运行时函数可以动态加载Objective-C模块(objc/objc-load.h中的objc_loadModules),但Cocoa的NSBundle类提供了更方便的动态加载接口。
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):
相关文章推荐
- iOS 开发 深入浅出Runtime运行时之方法动态处理(Dynamic Method Resolution)详解
- [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)
- [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)
- 深入浅出Cocoa之消息(二)-详解动态方法决议(Dynamic Method Resolution) 【转】
- [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)
- [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)
- 动态方法解析(Dynamic Method Resolution)
- 动态linq表达式新方法,Dynamic LINQ Extension Method
- Struts2 ActionMethod 【DMI】(动态方法调用 Dynamic Method Invoke)
- struts.enable.DynamicMethodInvocation = true 动态方法调用(转)
- Objective-C研究之Runtime分析(四)-Dynamic Method Resolution
- [译]Objective-C Runtime Programming Guide -Dynamic Method Resolution ( 三)
- 多态,动态方法调度(dynamic method dispatch)?
- ios runtime系列 method_exchangeImplementations方法
- Runtime--Dynamic Method Resolution
- DMI(Dynamic Method Invocation) 动态方法调用
- struts.enable.DynamicMethodInvocation = true 动态方法调用(转)
- struts.enable.DynamicMethodInvocation = true 动态方法调用
- struts.enable.DynamicMethodInvocation = true 动态方法调用
- struts.enable.DynamicMethodInvocation = true 动态方法调用