respondsToSelector的相关使用


    • -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
    • -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
    • -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
    • +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
    • -(id) performSelector: selector

      SEL sel = @selector (start:) ; // 指定action  

      if ([obj respondsToSelector:sel]) 

      { //判断该对象是否有相应的方法  

      [obj performSelector:sel withObject:self]; //调用选择器方法  

      使用[[UIApplication sharedApplication] keyWindow]查找应用程序的主窗口对象

      respondsToSelector判断是否实现了某方法

      Tester.h

      复制代码
      #import <Foundation/Foundation.h>


      @interface Tester : NSObject {

      }

      -(void) test:(NSString*) msg;

      -(void) notImp;

      @end
      复制代码
      Tester.m
      复制代码
      #import "Tester.h"

      @implementation Tester

      -(void) test:(NSString*) msg
      {
      NSLog(@"%@", msg);
      }

      @end
      复制代码
      注意:没有实现notImp方法

      main.m

      复制代码
      #import <Foundation/Foundation.h>
      #import "Tester.h"

      int main (int argc, const char * argv[])
      {

      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

      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])
      {
      //test.m中没有实现此主就去
      [tester notImp];
      }


      [pool drain];
      return 0;
      }
      复制代码
       
       
       
       
      1. #import <UIKit/UIKit.h>  
      2.    
      3. @interface ViewController : UIViewController{  
      4.     UIButton *btn1;  
      5.     UIButton *btn2;  
      6.      
      7.     UILabel *label1;  
      8. }  
      9.    
      10. -(void)testRespond1;  
      11. -(void)notTest;  
      12.    
      13. @end  
      14.    
      15.    
      16. #import "ViewController.h"  
      17.    
      18. @implementation ViewController  
      19.    
      20. - (void)didReceiveMemoryWarning  
      21. {  
      22.     [super didReceiveMemoryWarning];  
      23.     // Release any cached data,images, etc that aren't in use.  
      24. }  
      25.    
      26. #pragma mark - View lifecycle  
      27.    
      28. - (void)viewDidLoad  
      29. {  
      30.     [super viewDidLoad];  
      31.          // Do any additional setupafter loading the view, typically from a nib.  
      32.      
      33.     btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
      34.     btn1.frame = CGRectMake(50, 100, 100, 50);  
      35.     [btn1 setTitle:@"BTN1" forState:UIControlStateNormal];  
      36.     [btn1 addTarget:self action:@selector(btn1Clicked:) forControlEvents:UIControlEventTouchUpInside];  
      37.     [self.view addSubview:btn1];  
      38.      
      39.     btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
      40.     btn2.frame = CGRectMake(200, 100, 100, 50);  
      41.     [btn2 setTitle:@"BTN2" forState:UIControlStateNormal];  
      42.     [btn2 addTarget:self action:@selector(btn2Clicked:) forControlEvents:UIControlEventTouchUpInside];  
      43.     [self.view addSubview:btn2];  
      44. }  
      45.    
      46. -(void)btn1Clicked:(id)sender  
      47. {  
      48.     if ([self respondsToSelector:@selector(testRespond1)])  
      49.     {  
      50.        [self testRespond1];  
      51.     }  
      52. }  
      53.    
      54. -(void)btn2Clicked:(id)sender  
      55. {  
      56.     if (![self respondsToSelector:@selector(notTest)])  
      57.     {  
      58.        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"notTest 没有被实现" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];  
      59.         [alert show];  
      60.         [alert release];  
      61.     }  
      62. }  
      63.    
      64. -(void)testRespond1  
      65. {  
      66.     label1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 220, 200)];  
      67.     label1.text = @"testRespond1 被实现了";  
      68.     [self.view addSubview:label1];  
      69.     [label1 release];  
      70. }  
      71.    
      72. - (void)viewDidUnload  
      73. {  
      74.     [super viewDidUnload];  
      75.     //Release any retained subviews of the main view.  
      76.     // e.g.self.myOutlet = nil;  
      77. }  
      78.    
      79. -(void)dealloc  
      80. {  
      81.     [super dealloc];  
      82. }  
      83.    
      84. @end  
原文地址:https://www.cnblogs.com/lvyinbentengzhe/p/4154028.html