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

© atlas 中级黑马   /  2014-12-17 15:50  /  748 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

OC中SEL怎么将方法封装成一个消息,求举例,分步说明,越详细越好。
还有就是以下两句代码怎么理解,求每句具体解释,不要大概解释。
如果把test3:方法声明为一个SEL,那么第二句调用的时候为什么不这样写:[p performSelector: s];
  1. SEL s = @selector(test3:);
  2. [p performSelector:3 withObjet:@"455"];
复制代码


1 个回复

倒序浏览
[p performSelector:s withObjet:@"455"];额 应该是“s”不是3吧。。
太深的理解不知道 。。= =目前已知的知识,调用方法有两种方式:
1.直接调用
假如有个Student类
Student *stu = [[Student alloc] init];
[stu test]; // 让对象stu调用test方法
这种方式特点是编译器在编译阶段可以做检查 如果没有Student类中没有声明test会报错。
当然如果是id stu =[[Student alloc] init]; 动态类型,编译阶段也无法检查。
2.利用performSelector:
首先要把方法名包装成一个SEL数据。SEL s = @selector(test);
然后给stu发送这个消息。[stu performSelector:s];
这样stu就会根据SEL对应的方法找到方法并执行。
这种方式是无法在编译阶段检查的,编译器也不知道test到底有没有,一旦没有,运行直接崩溃。当然好处就是可以在运行时实时调用(比如可以根据输入方法名保存字符串再转化成SEL)。大概是“这有锦囊一封,到时候拆开依计行事”,但是也有可能真的拆开锦囊才发现上面只是胡说八道一些没用的。
为了安全起见,可以先测试,如果stu能响应这个,再调用。
if ([stu respondsToSelector:@selector(test)]) {
    [stu performSelector:@selector(test)];
}
至于withObjet:@"455",这个是方法test3:的参数,还可以传第二个参数,更多就不知道了。。
回复 使用道具 举报 0 1
您需要登录后才可以回帖 登录 | 加入黑马