黑马程序员技术交流社区

标题: 复习的第三天,总结下SEL [打印本页]

作者: SailY    时间: 2014-9-10 20:39
标题: 复习的第三天,总结下SEL
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法

方法的存储位置:
1. 每个类的方法列表都存储在类对象中
2. 每个方法都有一个与之对应的SEL类型的数据
3. 根据一个SEL数据就可以找到方法的地址,进而调用方法


每个方法内部都有个 SEL 类型的_cmd,代表当前方法
验证:
- (void)text2
{
    NSString *str = NSStringFromSelector(_cmd);
    NSLog(@"text2-----%@",str);
}
然后再main.m
Person *p = [[Person alloc]init];
[p text2];

结果打印str的值为text2,说明了_cmd就是代表当前方法,代码表示为_cmd ==@selector(text2);
注意:在text2内部这样写会死循环,[self performSelector:_cmd];
加深理解:
// 1.把text2包装成SEL类型的数据
    // 2.根据SEL数据找到对应的方法地址
    // 3.根据方法地址调用对应的方法
    // [p text2];或者用下面的方法
    [p performSelector:@selector(text2)];

    // 有参数的话,可以用这两种方式
    // [p text3:@"123"];
    SEL s = @selector(text3:);
    [p performSelector:s withObject:@"123"];

    // 只知道方法名字符串,这样用
    NSString *name = @"text";
    SEL s = NSSelectorFromString(name);
    [p performSelector:s];

综上,两种方法转换为SEL数据:
SEL s = @selector(text3:);
SEL s = NSSelectorFromString(name);




作者: 庄得超    时间: 2014-9-10 20:54
不错,一起学习
作者: 袁枭飞    时间: 2014-9-10 21:17
不错,可以看看
作者: sk0806    时间: 2014-9-10 22:55
肿么,,,,还有表情了
作者: 朱亚男    时间: 2014-9-11 09:19
不错……,,
作者: 我说你是个逗比    时间: 2014-9-11 12:37
总结的很细致




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2