A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SailY 中级黑马   /  2014-9-10 20:39  /  1636 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);



评分

参与人数 1技术分 +1 收起 理由
★彬★卍囧神 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
不错,一起学习
回复 使用道具 举报
不错,可以看看
回复 使用道具 举报
肿么,,,,还有表情了
回复 使用道具 举报
朱亚男 来自手机 中级黑马 2014-9-11 09:19:38
报纸
不错……,,
回复 使用道具 举报
总结的很细致
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马