- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好像instanceMethodSignatureForSelector
是类方法,而methodSignatureForSelector
是实例方法。然而,他们的描述和用例并没有让我得出这个结论。那有什么区别呢?
最佳答案
由于我们对消息传递和消息转发概念有足够的信息,所以让我们讨论解决方案。在我目前从事的项目中,有一个搜索功能。用户可以使用某些条件搜索结果。该标准由主要标准和高级标准组成,数据模型类适用于这两种标准。主数据模型将包含辅助数据模型作为属性。有一个框架负责将数据库表映射到指定的数据模型。为了保存或检索数据,框架将向映射的数据模型类发送消息。该框架不支持嵌套映射。主数据模型类映射到数据库表,因此框架将期望列映射到属性,并将 setter 和 getter 消息发送到主数据模型类。解决方案是使高级数据模型成为主要数据模型的代理。在主数据模型类中,通过覆盖以下方法,将辅助数据模型设置为主数据模型类的代理。
- (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/
关于ios - methodSignatureForSelector 和 instanceMethodSignatureForSelector 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32154597/
好像instanceMethodSignatureForSelector是类方法,而methodSignatureForSelector是实例方法。然而,他们的描述和用例并没有让我得出这个结论。那有什
NSString 的头文件有这样的函数声明: - (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len enco
我是一名优秀的程序员,十分优秀!