objective-c中的协议或类特定选择器

时间:2015-06-08 20:55:45

标签: objective-c warnings

使用选择器调用存在于多个类中的方法(但在返回或参数类型上具有不同的签名)会导致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];

当协议的方法与同一个签名冲突时,还有哪些其他替代方法可以用于检查和执行方法?

1 个答案:

答案 0 :(得分:0)

我的2美分。使用运行时引用。在这种情况下,它会绕过编译器警告/错误。看起来有几种方法可以做到这一点,这是我的解决方案。

#import <objc/message.h>

struct objc_method *method = class_getInstanceMethod([self class], @selector(contentMode));
id answer = method_invoke(self, method);

这应该可以防止名称相同的不同协议中的选择器出错。但我不确定这对于基类和超类中具有不同实现的方法的行为方式。