在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制,
动态方法解析对象在收到无法解读的消息之后,首先调用其所属类的下列类方法 + (BOOL)resolveInstanceMethod:(SEL)selector 返回值为BOOL,表示这个类是否能新增一个实例方法用以处理此选择子。 使用这种方法的前提是:相关方法的实现代码已经写好,只等着运行的时候动态插在类里面就可以了。此方案常用来实现@dynamic属性,比如说要访问CoreData框架中NSManagedObjects对象的属性时就可以这么做,因为实现这些属性所需的存取方法在编译期就能确定。 下列代码演示了如何用“resolveInstanceMethod:”来实现@dynamic实行; id autoDictionaryGetter(id self, SEL _cmd);
void autoDictionarySetter(id self, SEL _cmd, id value);
+ (BOOL)resolveInstanceMethod:(SEL)selector {
NSStirng *selectorString = NSStringFromSelector(selector);
if (/*selector is from a @dynamic property */) {
if ([selectorString hasPerfix:@"set"]) {
class_addMethod(self,
selector,
(IMP)autoDictionarySetter,
"v@:@");
} else {
class_addMethod(self,
selector,
(IMP)autoDictionaryGetter,
"@@:");
}
return YES;
}
}
return [super resolveInstanceMethod:selector];
}
备援接受者- (id)forwardingTargetForSelector:(SEL)selector
完整的消息转发首先创建NSInvocation 对象,把与尚未处理的那条消息有关的全部细节都封于其中。此对象包括 selector、target、及参数在触发NSInvocation 对象时,“消息派发系统”(message-dispatch system)将亲自出马,把消息指派给目标对象。 - (void)forwardInvocation:(NSInvocation *)invocation
消息转发全流程以完整的例子演示动态方法解析
|
请发表评论