似乎instanceMethodSignatureForSelector
是一个类方法,而methodSignatureForSelector
是一个实例方法。但是,他们的描述和用例并没有让我得出这个结论。那有什么区别?
答案 0 :(得分:2)
由于我们有关于消息传递和消息转发概念的足够信息,我们来讨论解决方案。在我目前正在进行的项目中,有一个搜索功能。用户可以使用某些条件搜索结果。此标准由主要和高级标准组成,并且两者都有数据模型类。主数据模型将包含辅助数据模型作为属性。有一个框架负责将数据库表映射到指定的数据模型。为了保存或检索数据,框架将向映射的datamodel类发送消息。此框架不支持嵌套映射。主datamodel类映射到数据库表,因此框架将期望将列映射到属性,并将setter和getter消息发送到主datamodel类。解决方案是使高级数据模型成为主数据模型的替代。在主数据模型类中,通过重写以下方法,辅助数据模型将设置为主数据模型类的代理。
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature) {
signature = [surrogate instanceMethodSignatureForSelector:selector];
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([surrogate respondsToSelector:[anInvocation selector]])
[anInvocation invokeWithTarget:surrogate];
else
[super forwardInvocation:anInvocation];
}
如果我使用了手动添加setter和getter的初始方法,我最终会编写尽可能多的方法,只需要两倍的属性,并且必须确保所有方法签名都模仿高级条件属性。对属性名称的任何更改都是regressin的良好切入点,代码维护将变得一团糟。其他方法是维护单个数据模型,该数据模型将代表所有标准,这些标准将产生其他问题,因为iPhone和iPad的要求不同。消息转发方法减少了所需的手动工作量,即使数据模型发生了变化,也可以进行扩展。
参考:http://blog.imaginea.com/message-forwarding-and-surrogate-objects-in-objective-c/
答案 1 :(得分:1)
虽然instanceMethodSignatureForSelector
是一个函数,您可以调用它来获取任何类的方法的签名,但methodSignatureForSelector
是您主要要覆盖的函数,以便为运行时提供替代方法查找协议的方法。
(杰伊的答案就是举一个例子,但我想我应该提供这个简短的解释,以防你还没有得出这个结论。)