您尝试做的事情是完全可以接受的,尽管不一定是每个程序员方法的基础。(我并不总是这样做,尽管也许我应该这样做。)
你检查的方式是这样的:
if([someObject respondsToSelector:@selector(someSelector)]){
[someObject someSelector];
}
如果您向对象发送消息但它没有响应,您将遇到运行时崩溃。如果您提前检查,您的逻辑可能完全不正确。(一个常见的例子是当你认为你在处理一个对象时,实际上你在处理完全不同的东西。这引入了开发过程中的崩溃与运行时的预期值/行为之间的权衡。
如果您仔细编码,您将比详细检查走得更远。
编辑:
再考虑一下您的问题,运行时还提供了该conformsToProtocol:
方法,该方法允许您检查类或实例是否符合协议。这似乎正是您想要的。
无论您多么小心,这对于不崩溃实际上至关重要的地方是,当您添加对新 iOS 功能的支持同时保持向后兼容性时。(在这种情况下,您对新框架的链接较弱,并使用这些相同的检查来确保兼容性。
正如其他人所指出的,当涉及到协议时,您确实会得到某种形式的编译时检查。如果一个方法没有被标记为@optional
,Xcode 会警告你一个不完整的实现。