zoukankan      html  css  js  c++  java
  • oc41--SEL

    //
    //  main.m
    //  代理的时候用。
    /*  SEL类型:
        代表方法的签名,在类中的方法列表中存储着该签名与该方法对应的关系,类的方法列表存储在类对象中,
        每个方法都有一个与之对应的sel类型的对象,根据sel类型的对象就可以找到方法的地址而进行调用。
        [p test]会先把test包装成sel类型的数据,根据sel类型的数据去类对象中的方法列表中去一个一个找,
        找到就执行代码,没有找到就去父类找。sel找到一次之后就会有缓存,下次从缓存中取,降低了性能消耗。
        sel是一个类型:就可以定义变量,作为函数参数,作为返回值。
     */
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Car.h"
    
    int main(int argc, const char * argv[]) {
        // 1.SEL类型的第一个作用, 配合对象|类来检查对象|类中有没有实现某一个方法,
        SEL sel = @selector(setAge:);//sel对象里面存储着setAge:方法的地址,
        Person *p = [Person new];
        // 判断p对象中有没有实现-号开头的setAge:方法,如果P对象实现了setAge:方法那么就会返回YES,如果P对象没有实现setAge:方法那么就会返回NO,
        BOOL flag = [p respondsToSelector:sel];
        NSLog(@"flag = %i", flag);//1
        // respondsToSelector注意点:
        //如果是通过一个对象来调用该方法那么会判断该对象有没有实现-号开头的方法
        // 如果是通过类来调用该方法, 那么会判断该类有没有实现+号开头的方法
        SEL sel1 = @selector(test);
        flag = [p respondsToSelector:sel1];
        NSLog(@"flag = %i", flag);//0,没有-test
        flag = [Person respondsToSelector:sel1];
        NSLog(@"flag = %i", flag);//1,有+test
         
        
        
        // 2.SEL类型的第二个作用, 配合对象/类来调用某一个SEL方法
        SEL sel2 = @selector(demo);
        Person *p2 = [Person new];
        // 调用p对象中sel类型对应的方法-demo
        [p2 performSelector:sel];
        
        SEL sel12 = @selector(signalWithNumber:);
        // withObject: 需要传递的参数
        // 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型,
        // 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象
        [p2 performSelector:sel12 withObject:@"13838383438"];//number = 13838383438
        
        SEL sel22 = @selector(setAge:);
        [p2 performSelector:sel22 withObject:@(5)];
        NSLog(@"age = %i", p2.age);//age = 1319,基本数据类型不行
        
        SEL sel222 = @selector(age);
        [p2 performSelector:sel22];
        NSLog(@"age = %i", p2.age);
        
        // 注意:performSelector最多只能传递2个参数
        SEL sel32 = @selector(sendMessageWithNumber:andContent:);
        [p2 performSelector:sel32 withObject:@"138383438" withObject:@"abcdefg"];//number = 138383438, content = abcdefg
        
        
        // 3.配合对象将SEL类型作为方法的形参
        Person *c3 = [Car new];
        SEL sel3 = @selector(run);
        
        Person *p3 = [Person new];
        [p3 makeObject:c3 andSel:sel3];//makeObject是Person方法名
        return 0;
    }
    //  Person.h
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property int age;
    
    + (void)test;
    - (void)demo;
    
    - (void)signalWithNumber:(NSString *)number;
    
    - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content;
    
    // 调用传入对象的指定方法
    - (void)makeObject:(id)obj andSel:(SEL)sel;
    
    - (void)run;
    @end
    //  Person.m
    
    #import "Person.h"
    
    @implementation Person
    
    + (void)test
    {
        NSLog(@"test");
    }
    
    - (void)demo
    {
        NSLog(@"demo");
    }
    
    - (void)signalWithNumber:(NSString *)number
    {
        NSLog(@"number = %@", number);
    }
    
    - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content
    {
        NSLog(@"number = %@, content = %@", number, content);
    }
    
    - (void)makeObject:(id)obj andSel:(SEL)sel
    {
        [obj performSelector:sel];
    }
    
    - (void)run
    {
        NSLog(@"run");
    }
    @end
  • 相关阅读:
    POJ 2513 (Trie树+欧拉通路+并查集判断连通)
    归并排序及序列逆序数
    POJ 2442 Sequence (堆+K路归并)
    POJ 2513 (Trie树+欧拉通路+并查集判断连通)
    J2EE概述
    J2EE概述
    J2EE概述
    学习视频资料下载论坛
    J2EE概述
    J2EE概述
  • 原文地址:https://www.cnblogs.com/yaowen/p/7418698.html
Copyright © 2011-2022 走看看