[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:的参数,还可以传第二个参数,更多就不知道了。。 |