87,SEL类型

#import


@interface Person : NSObject


+(void)run;

-(void)print;

-(void)signalWithNumber:(NSString *)number andContent:(NSString *)content;

-(void)carryMehtod:(id)p :(SEL)sel;


@end


@implementation Person


+(void)run{

    NSLog(@"run");

}


-(void)print{

    NSLog(@"print!");

}

-(void)signalWithNumber:(NSString *)number andContent:(NSString *)content{

    NSLog(@"number = %@,content = %@",number,content);

}


-(void)carryMehtod:(id)p :(SEL)sel{

    [p performSelector:sel];

}


@end

/*

  SEL类型代表着方法的签名,在类对象的方法列表中存储着该签名与方法代码的对应关系

  每个类的方法列表都存储在类对象中

  每个方法都有一个与之对应的SEL类型的对象

  根据一个SEL对象就可以找到方法的地址,进而 调用方法

 eg[p test];

 >首先把test方法名包装成sel类型的数据

 >根据SEL类型到该类的类对象上去找对应的方法的代码,如果找到该代码就执行

 >如果没有找到,就一直往父类上找,直到基类(NSObject

 >如果都没有找到,就会报错

 注:方法寻找的过程是有缓存的,第一次找的时候,是一个一个找,非常耗性能,之后,要用到该方法,就从缓存中使用便可

 */


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

    @autoreleasepool {

       /*1SEL类型的第一个作用,配合对象/类检查对象/类中有没有存在某个方法

            存在某个方法flag返回为YES,否则,返回NO

            respondsToSelector:

            如果是通过一个对象调用该方法,那么,它判断是否存在的方法是对象方法

            如果是通过类调用该方法,那么,它判断是否存在的方法是类方法

        */

        SEL sel = @selector(print);

        Person *person = [[Person alloc]init];

        BOOL flag = [person respondsToSelector:sel];

        SEL sel1 = @selector(run);

        NSLog(@"flag = %i",flag);

        BOOL flag1 = [Person respondsToSelector:sel1];

        NSLog(@"flag = %i",flag1);

        

        /*

         2,SEL类型的第二个作用,配合对象/类来调用某一个SEL方法

          performSelector:只能传递两个参数,都是对象参数,基本数据类型不能用

         */

        [person performSelector:sel];

        [Person performSelector:sel1];

        SEL sel3 = @selector(signalWithNumber:andContent:);

        [person signalWithNumber:@"13411379410" andContent:@"你好!"];

        /*

         3,配合对象,SEL作为参数传递

         */

        [person carryMehtod:person :sel];

        

    }

    return 0;

}


//2015-12-12 16:56:42.280 11sel类型[2946:205855] flag = 1

//2015-12-12 16:56:42.281 11sel类型[2946:205855] flag = 1

//2015-12-12 16:56:42.281 11sel类型[2946:205855] print!

//2015-12-12 16:56:42.281 11sel类型[2946:205855] run

//2015-12-12 16:56:42.281 11sel类型[2946:205855] number = 13411379410,content = 你好!

//2015-12-12 16:56:42.281 11sel类型[2946:205855] print!

//Program ended with exit code: 0

你可能感兴趣的:(OC)