首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用@selector动态加载方法

使用@selector动态加载方法

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]];
    }
返回列表