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来表示类可用性。