SEL类型

1. 【理解】什么是SEL类型

2. 【掌握】SEL使用

3. 【理解】OC方法查找顺序

 

1.什么是SEL类型

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

 

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

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

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

- SEL类型的定义

    + typedef struct objc_selector         *SEL;

 

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

- 根据SEL数据到该类的类对象中,去找对应的方法的代码,如果找到了就执行该代码

- 如果没有找到根据类对象上的父类的类对象指针,去父类的类对象中查找,如果找到了,则执行父类的代码

- 如果没有找到,一直像上找,直到基类(NSObject)

- 如果都没有找到就报错。

 

- >注意:

    >+ 在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

Dog *dog=[[Dog alloc] init];

[dog eat];

 

 

2. SEL使用

 

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Animal.h"

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

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

    //SEl型类第一个作用:配合类/对象检查是否实现了类/对象的方法

    SEL sel = @selector(eat);

    BOOL sign = [p respondsToSelector:sel];

    NSLog(@"sel:%i",sign);

    [p speak];

    SEL sel2 = @selector(speak);

    BOOL sign2 = [p respondsToSelector:sel2];

    NSLog(@"sel2:%i",sign2);

    //SEL类型第二个作用:配合类/对象调用某一个SEL方法

    [p performSelector:sel2];

    // withObject: 需要传递的参数

    // 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型,

    // 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象

    SEL sel3 = @selector(signalWithNumber:);

    [p performSelector:sel3 withObject:@"1008611"];

    SEL sel4 = @selector(sentMessageWithNumber:andCotent:);

    [p performSelector:sel4 withObject:@"1008611" withObject:@"CXGPRS"];

    //SEL类型第三个作用:作为方法的形参

    Animal *a = [[Animal alloc]init];

    Class c  = [Animal class];

    SEL sel5 = @selector(run);

    SEL sel6 = @selector(eat);

    [p makeObject:a andSel:sel5];

    [p makeObject:c andSel:sel6];

    // 注意:performSelector最多只能传递2个参数

    return 0;

}

 

3.OC方法查找顺序

 

posted @ 2015-11-26 14:59  a滴答  阅读(206)  评论(0编辑  收藏  举报