在Objective C中,您可以检查对象是否具有特定属性或消息吗?

And*_*son 50 objective-c

我想做这样的事情:

if (viewController.mapView) [viewController.mapView someMethod];
Run Code Online (Sandbox Code Playgroud)

但是,如果mapView不是类变量,则会崩溃.如何检查mapView是否存在?

dcr*_*sta 47

对于普通选择器,您可以使用respondsToSelector:.我不确定这是否适用于新式属性访问(因为在这个例子中你似乎使用它).要测试类是否响应给定的选择器,请使用instancesRespondToSelector:.

  • 属性getter是一个名称与属性匹配且没有参数的方法(即签名中没有尾随冒号). (4认同)
  • 哇,Objective-C是不是一个简洁的呢? (2认同)
  • @chaiguy:Objective-C尽可能简洁.这是证据:[最长的Objective-C方法](http://stackoverflow.com/a/15152232/2783780). (2认同)

Rob*_*ert 35

此外,正如Jason在这里指出的那样,您还可以使用NSSelectorFromString在运行时动态检查.例如

if ([self respondsToSelector:NSSelectorFromString(elementName)]) 
{
    [self setValue:elementInnerText forKey:elementName];
}
Run Code Online (Sandbox Code Playgroud)

  • @Stunner - 可能会被误解,但是文档似乎暗示`NSSelectorFromString`无论是否实现都会返回SEL.这不是问题,因为`respondsToSelector:`执行我们感兴趣的实际检查. (4认同)

And*_*son 31

哎呀,发现它:

if ([vc respondsToSelector:@selector(mapView)]) {

  [[vc mapView] viewWillAppear:YES];

}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在合成属性方法中使用它,例如`setMapView:` (2认同)