respondsToSelector returns YES for "setTitle:" on UIButton 但没有这样的选择器

respondsToSelector returns YES for "setTitle:" on UIButton but there is no such selector

我正在使用 respondsToSelector:,大多数情况下它工作正常。但是有一种情况我得到了错误的结果:

UIButton* button = [[UIButton alloc] init];
if([button respondsToSelector:NSSelectorFromString(@"setTitle:")]) // returns YES
{
    // try to call "setTitle:"
}

respondsToSelector: returns 是,但 UIButton class 中没有 setTitle: 选择器。有 setTitle:forState: 选择器,但这绝对不一样。

那么为什么 respondsToSelector: return 是?

响应选择器不只是检查 public 接口,它会采用它能找到的任何方法。我不记得 UIButton 的早期 API 是否曾直接公开标题,但在内部它可能被称为状态变化。

尝试仅将 respondsToSelector: 用于您实际需要验证的 API 是否存在,并注意通常有私有 API,稍后会生成 public 和这也会导致有趣的情况...

Alexandr,只有当您要检查对象是否实现了您将要调用的方法时,才应使用此 "respondsToSelector" 方法。还有设置Button Title,为什么要用这个??

您通常在使用自定义委托方法时应该使用此方法..