使用选择器调用存在于多个类中的方法(但在返回或参数类型上具有不同的签名)会导致Multiple methods named [method name] found...
错误。
其他问题已经解决了这个问题:
如果重复方法在协议中,则会发生相关问题。具有强类型协议对象对于编译器仍然是不明确的,因为该对象也可以是实现相同签名方法的其他类的实例:
@protocol ExistingMethodProtocol <NSObject>
// This method also exists in UIView, but with a different return type
- (NSString*)contentMode;
@end
@interface ImplementingClass : NSObject <ExistingMethodProtocol>
@end
@implementation ImplementingClass
- (NSString*)contentMode {return nil;}
- (void)problematicCall
{
// Multiple methods named... error
[self performSelector:@selector(contentMode)];
id<ExistingMethodProtocol> idOfProtocol = self;
// Multiple methods named... error too, even casted
[idOfProtocol performSelector:@selector(contentMode)];
}
@end
另一种方法是单独创建选择器然后执行,从而通过编译器检查但引发警告:
SEL selector = @selector(contentMode);
// Warning: PerformSelector may cause a leak because its selector is unknown
[object performSelector:selector];
当协议的方法与同一个签名冲突时,还有哪些其他替代方法可以用于检查和执行方法?
答案 0 :(得分:0)
#import <objc/message.h>
struct objc_method *method = class_getInstanceMethod([self class], @selector(contentMode));
id answer = method_invoke(self, method);
这应该可以防止名称相同的不同协议中的选择器出错。但我不确定这对于基类和超类中具有不同实现的方法的行为方式。