Ios 何时使用respondsToSelector vs objc_getClass
总的来说,这两者的结果是相同的。有没有一个比另一个更好的情况?或者应该只使用其中一个,而忘记另一个?响应选择器:这主要用于检查对象引用是否可以调用特定方法。例如,对象继承自某个基类或由某个协议实现,那么最好检查对象是否能够响应该方法,然后只调用它 否则它将抛出运行时错误,找不到方法类型Ios 何时使用respondsToSelector vs objc_getClass,ios,swift,Ios,Swift,总的来说,这两者的结果是相同的。有没有一个比另一个更好的情况?或者应该只使用其中一个,而忘记另一个?响应选择器:这主要用于检查对象引用是否可以调用特定方法。例如,对象继承自某个基类或由某个协议实现,那么最好检查对象是否能够响应该方法,然后只调用它 否则它将抛出运行时错误,找不到方法类型 if respondsToSelector("UIAlertController"){ //do something } if objc_getClass("UIAlertController") !=
if respondsToSelector("UIAlertController"){
//do something
}
if objc_getClass("UIAlertController") != nil{
//do something
}
objc_getClass:指定类的类对象,如果该类未在Objective-C运行时注册,则为nil。这意味着,您是否能够访问该类,如果该类不存在,那么它将返回“nil”。所以
if([obj respondsToSelector:@selector(anyMethod)]) {
[obj fizzyWizzle];
}
else {
// do something
}
希望这有帮助。响应选择器:这主要用于检查对象引用是否可以调用特定方法。例如,对象继承自某个基类或由某个协议实现,那么最好检查对象是否能够响应该方法,然后只调用它
否则它将抛出运行时错误,找不到方法类型
if respondsToSelector("UIAlertController"){
//do something
}
if objc_getClass("UIAlertController") != nil{
//do something
}
objc_getClass:指定类的类对象,如果该类未在Objective-C运行时注册,则为nil。这意味着,您是否能够访问该类,如果该类不存在,那么它将返回“nil”。所以
if([obj respondsToSelector:@selector(anyMethod)]) {
[obj fizzyWizzle];
}
else {
// do something
}
希望这有帮助。要检查类是否存在,必须使用objc_getClass。与iOS版本的类兼容性
要检查实现了方法或方法的类是否可用,需要使用respondsToSelector For method availability with versions检查类是否存在,必须使用objc_getClass。与iOS版本的类兼容性
要检查实现方法的类或方法是否可用,您需要在版本中使用respondsToSelector For method availability(方法可用性)这两种方法总体上没有相同的结果 响应选择器 第一种情况respondsToSelector是NSObject协议的一部分,它仅指示对象在调用时是否能够响应具有给定签名的消息。它可用于多种情况: 多态性。即非正式协议,或者特别是与conformsToProtocol结合使用,以检查任何类的实例是否响应@optional指令下的协议部分。 用于决定是否将消息转发到另一个目标。 用于在运行时使用附加功能检测对象,例如将事务/回滚功能放在持久模型对象上。 在发布/订阅类型场景中。 上课 第二种方法是Objective-C运行时的低级成员。它用于简单地检查对象本身呈现为的类的类型。它将检查isa指针。NSObject协议上有一些方法可以做同样的事情,通常建议使用这些方法,除非您有特定的理由退回到较低级别的API。这些方法是[实例类]和[实例是类的一种] 将instanceof替换为多态性 虽然查询对象的类有很多有效的用途,但在典型的应用程序中,这通常是一个设计缺陷。有一种称为replace instanceof with polymorphics的重构模式。我们的意思是,不要问一个对象它是什么类型的类,然后做一些事情,而不是基于这个,而是创建一个协议,让每个可能的类以它们特定的方式实现该协议的方法。例如:
if objc_getClass("UIAlertController") != nil{
// it means, these class is available in SDK, hence its iOS version is 8.x
// here you can alloc - init and use UIAlertController functionality
}
else {
// class could not be found
// iOS version is < 8.0
// here that class is not available hence use UIAlertView which is supported by iOS 7 and earlier.
}
相反,你应该
if ([foo isKindOfClass:[Holiday class]]) {
//evaluate if approved
} else if ([foo isKindOfClass:[SickLeave class]]) {
//evaluate if approved
}
这两种方法的总体结果并不相同 响应选择器 第一种情况respondsToSelector是NSObject协议的一部分,它仅指示对象在调用时是否能够响应具有给定签名的消息。它可用于多种情况: 多态性。即非正式协议,或者特别是与conformsToProtocol结合使用,以检查任何类的实例是否响应@optional指令下的协议部分。 用于决定是否将消息转发到另一个目标。 用于在运行时使用附加功能检测对象,例如将事务/回滚功能放在持久模型对象上。 在发布/订阅类型场景中。 上课 第二种方法是Objective-C运行时的低级成员。它用于简单地检查对象本身呈现为的类的类型。它将检查isa指针。NSObject协议上有一些方法可以做同样的事情,通常建议您使用这些方法,除非您有特定的理由退回到低级别 er级API。这些方法是[实例类]和[实例是类的一种] 将instanceof替换为多态性 虽然查询对象的类有很多有效的用途,但在典型的应用程序中,这通常是一个设计缺陷。有一种称为replace instanceof with polymorphics的重构模式。我们的意思是,不要问一个对象它是什么类型的类,然后做一些事情,而不是基于这个,而是创建一个协议,让每个可能的类以它们特定的方式实现该协议的方法。例如:
if objc_getClass("UIAlertController") != nil{
// it means, these class is available in SDK, hence its iOS version is 8.x
// here you can alloc - init and use UIAlertController functionality
}
else {
// class could not be found
// iOS version is < 8.0
// here that class is not available hence use UIAlertView which is supported by iOS 7 and earlier.
}
相反,你应该
if ([foo isKindOfClass:[Holiday class]]) {
//evaluate if approved
} else if ([foo isKindOfClass:[SickLeave class]]) {
//evaluate if approved
}
在Swift中,使用可选链接更节省。在使用这些函数时,您希望检查什么?ios8与ios7类/方法的兼容性在Swift中,使用可选链接更节省。在使用这些函数时,您希望检查什么?ios8与ios7类/方法的兼容性我确信,它可能是苹果公司的私有API,允许进行检查。但根据苹果的文档,我们应该使用respondsToSelector来表示方法可用性,使用objc_getClass来表示类可用性。如果你浏览任何苹果文档,它都会说同样的话。我相信,可能是苹果的私有API允许检查这一点。但是根据苹果的文档,我们应该使用respondsToSelector来表示方法可用性,使用objc_getClass来表示类可用性。