Select[11321:303] 1
2014-03-22 20:28:09.778 ObjectSelect[11321:303] 1
2014-03-22 20:28:09.778 ObjectSelect[11321:303] 0
2014-03-22 20:28:09.779 ObjectSelect[11321:303] 1
第一个和第二个方法的调用都返回1,说明其有能力回应(调用)方法eat, 关键看第三个和第四个方法的调用,返回0,1 说明实例和对象的调用是不一样的,而Info方法是一个全局方法 ,用 "+" 标识的方法就是全局方法,相当于静态方法。第3个方法是使用实例来调用的返回0,说明对象实例是没有能力调用静态方法的。
(4) instancesRespondToSelector 用于判断某个对象的实例是否有能力回应(调用)指定的方法
bool flag7=[Person instancesRespondToSelector:@selector(eat)];
NSLog(@"%d",flag7);
bool flag8=[Person instancesRespondToSelector:@selector(Info)];
NSLog(@"%d",flag8);
上面的测试代码输出结果如下:
2014-03-22 20:39:04.700 ObjectSelect[11344:303] 1
2014-03-22 20:39:04.700 ObjectSelect[11344:303] 0
第一个方法调用返回1,说明Person的实例可以调用eat方法,第二个方法返回0,说明Person的实例不可以调用Info方法。
三. 如何动态调用方法
上面已经说到了,任何一个对象的实例我们都可以使用id来指向其地址,这是一个动态的类型那么如何调用其具体的方法。
[stu performSelector:@selector(eat)];
[Person performSelector:@selector(Info)];
使用 performSelector 方法可以动态的调用其方法,如果是实例方法则调用的需要使用对象实例,而调用静态方法这需要使用对象本身。
上面的办法调用都是没有参数的,那么如何调用有输入参数的方法呢?
[stu performSelector:@selector(speak:) withObject:@"ddddd"];
[stu performSelector:@selector(write: andAge:) withObject:@"fasdfadaf" withObject:@"333"];
使用 withObject 来填充参数.但是这个方法的调用有点不足的地方,如果有多个参数输入参数就有问题。 这个地方还没有完全没有弄清楚,有待后续研究。如果真的涉及到多个参数,那么可以使用对象封装好这些参数或者将参数存入一个集合中传递输入。
四. 总结
这篇主要讲到了动态类型id,以及其如何使用。还有关于类的动态判断以及选择器。但都只是比较粗略的介绍了,后面的学习中继续深入研究。