- -(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];
}
}