FROM:http://www.xcoder.cn/html/2012/objc_1210/223.html



Objective-C能够动态识别方法,通过在运行时实用@selector方法,动态加载需要的方法。这是Objective-C灵活性的一点儿。这里简单说说如何使用@selector动态加载方法。

如何定义@selector?

        通过Objective-C的SEL关键字可以定义一个selector,简单定义如下:



        SEL selName = @selector(methodName);
       


不过需要注意的是,这里的methodName是方法名,不能加引号的。但这点似乎并不能完全满足动态加载的要求,如果用户需要自行加载一个方法呢?如果 能够使用一个NSString对象来传递用户自行加载的方法则更灵活的多,行不行呢?当然可以,我们可以使用如下方法来定义一个SEL:


SEL selName = NSSelectorFromString(methodNameString);
       


NSSelectorFromString(NSString *)方法可以通过传递一个NSString对象来创建一个selector,这样就方便多了。不过需要注意的是,这个NSString对象的内容一定要符合方法命名规则,以免出错。

如何使用@selector?

只定义不使用这没有什么用。任何对象都是继承自NSObject,NSObject自身有selector的使用方法。这里说两个,一个是判断selector方法是否存在,一个是执行selector动态加载的方法。
判断selector加载方法存在的方法:



respondsToSelector:SEL。如果SEL加载方法存在,则返回YES,如果不存在则返回NO。
       



执行selector的方法:performSelector:SEL。


该方法将执行被加载的方法。但是,有的方法需要传递参数,这怎么办呢?不要紧,还有一个配套方法:performSelector:SEL withObject:,如果参数不止一个,还可以继续withObject。不过目前只支持两个参数传递,如果想传递多个参数,不妨考虑使用NSArray或者集合对象。这两个方法均是由NSObject Protocol定义的。

实例:



SEL conTag = NSSelectorFromString(tag);

    if ([self respondsToSelector:conTag]) {

        [self performSelector:conTag

                   withObject:[NSNumber numberWithDouble:first]

                   withObject:[NSNumber numberWithDouble:second]];

    }