如何使用可变方法名称抑制“类可能无法响应'-method'警告?

时间:2011-09-01 17:39:01

标签: objective-c

如何使用变量选择器名称阻止此警告?

NSString *methodName;

SEL method = NSSelectorFromString(methodName);

if ([self respondsToSelector:method]) {

    if ([methodName hasSuffix:@":"])
        [self method:dict];
    else
        [self method];

}

2 个答案:

答案 0 :(得分:9)

使用

[self performSelector:method];

而不是

[self method];

[self performSelector:method withObject:dict];

而不是

[self method:dict];

答案 1 :(得分:3)

sidyll的回答有效,但有一个更好的解决方案。

通常,您会声明一个协议:

 @protocol MyOptionalMethods
 @optional
 - (void)method:(NSDictionary*)dict;
 @end

声明你的对象符合协议:

id<MyOptionalMethods> foo;
UIView*<MyOptionalMethods> bar; // it'll be a subclass o' UIView and may implement pro to

然后检查:

if ([foo respondsToSelector:@selector(method:)])
    [foo method: dict];

这样,编译器就有机会完全键入检查所有参数。同样,这种模式不仅限于不带参数或单个对象参数的方法。

同样,这可以防止迁移到ARC(因为ARC正好抱怨performSelector的脆弱性:)。