methodSignatureForSelector和instanceMethodSignatureForSelector有什么区别?

时间:2015-08-22 09:39:46

标签: ios iphone nsobject nsinvocation

似乎instanceMethodSignatureForSelector是一个类方法,而methodSignatureForSelector是一个实例方法。但是,他们的描述和用例并没有让我得出这个结论。那有什么区别?

2 个答案:

答案 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是您主要要覆盖的函数,以便为运行时提供替代方法查找协议的方法。

(杰伊的答案就是举一个例子,但我想我应该提供这个简短的解释,以防你还没有得出这个结论。)