• -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
  • -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
  • -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
  • +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
  • -(id) performSelector: selector调用选择器方法
  • respondsToSelector判断是否实现了某方法
NSObject *obj;
    SEL sel = @selector(start:);//指定action
    if ([obj respondsToSelector:sel]) {//判断该对象是否有响应的方法
        NSLog(@"---调用选择器方法---");
        [obj performSelector:sel withObject:self];//调用选择器方法
    }else{
        NSLog(@"---该对象没有对应的响应方法---");
    }

使用[[UIApplication sharedApplication] keyWindow]查找应用程序的主窗口对象
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Tester : NSObject
-(void)test:(NSString*)msg;
-(void)notImp;

@end

NS_ASSUME_NONNULL_END

#import "Tester.h"

@implementation Tester
-(void)test:(NSString*) msg{
    NSLog(@"---***%@",msg);
}
//注意:没有实现notImp方法

@end

应用实例示例如下:

-(void)func{
    ImageCell *imageCell = [[ImageCell alloc] init];
    
    //用来判断是否是某个类 或 其子类的实例
    BOOL isTableViewCell = [imageCell isKindOfClass:UITableViewCell.class];
    NSLog(@"---isTableViewCell:%d",isTableViewCell);
    
    //用来判断是否是某个类的实例
    BOOL isMemberOfClass = [imageCell isMemberOfClass:imageCell.class];
    NSLog(@"---isMemberOfClass:%d",isMemberOfClass);
    
    //用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
    BOOL isExist_setupUI = [imageCell respondsToSelector:@selector(setupUI)];
    NSLog(@"---isExit_setupUI:%d",isExist_setupUI);
    NSLog(@"---isExit_setupUI:%d",[imageCell respondsToSelector:@selector(awakeFromNib)]);
    //用来判断实例是否有以某个名字命名的方法,和上面一个不同之处在于,前面这个方法可以用在实例和类上,而次方法只能用在类上
    NSLog(@"---isExit_setupUI:%d",[ImageCell instancesRespondToSelector:@selector(setupUI)]);
    if ([ImageCell instancesRespondToSelector:@selector(testNI)]) {
        [imageCell performSelector:@selector(testNI)];
    }
    
    NSObject *obj;
    SEL sel = @selector(start:);//指定action
    if ([obj respondsToSelector:sel]) {//判断该对象是否有响应的方法
        NSLog(@"---调用选择器方法---");
        [obj performSelector:sel withObject:self];//调用选择器方法
    }else{
        NSLog(@"---该对象没有对应的响应方法---");
    }
    
    id tester = [[Tester alloc] init];
    //注意:这里使用id
    SEL testSelector = @selector(test:);
    SEL notImpSelector = @selector(notImp:);
    
    if ([tester respondsToSelector:testSelector]) {
        //tester.m中实现了test方法
        [tester test:@"invoke test method"];
    }
    if ([tester respondsToSelector:notImpSelector]) {
        //tester.m中没有实现此方法
        [tester notImp];
    }
    
}