国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > IOS开发反射和动态调用总结

IOS开发反射和动态调用总结

来源:程序员人生   发布时间:2015-05-22 08:14:32 阅读次数:2830次
和java1样,Object-C也提供了反射的机制。

每个类都有1个Class,获得Class有以下3种方法。

// insert code here... //通过字符串获得class Class clazz = NSClassFromString(@"NSString"); NSLog(@"clazz的类型是%@",clazz); //直接用calzz 来创建对象 id str = [[clazz alloc] init]; //通过对象来获得class NSLog(@"%@",[str class]); //通过类来获得class NSLog(@"%d",clazz==NSString.class); NSLog(@"Hello, World!");
    /**
        2015-04⑵8 17:03:18.907 反射[1322:303] clazz的类型是NSString
        2015-04⑵8 17:03:19.279 反射[1322:303] __NSCFConstantString
        2015-04⑵8 17:03:19.280 反射[1322:303] 1
        2015-04⑵8 17:03:19.281 反射[1322:303] Hello, World!
        Program ended with exit code: 0
       打印出来的结果是这样,_NSString只是类簇的前端而已
     **/

对与第1种和第2种方式,都是根据类获得Class对象,比较之下,第1种代码安全性更高,程序再编译阶段就能够检测所需要访问的Class是不是存在。性能更高,由于无需调用方法。

动态调用的方法以下。直接上代码

#import <Foundation/Foundation.h> @interface JQCar : NSObject @end

#import "JQCar.h" #import <objc/message.h> @implementation JQCar - (void)move:(NSNumber*)count{ int num = [count intValue]; for (int i=0; i<num; i++) { NSLog(@"%@",[NSString stringWithFormat:@"汽车正在路上行走%d",i]); } } - (double)addSpeed:(double)factor{ //动态调用move方法 //使用performSelector动态调用move方法 [self performSelector:@selector(move:) withObject:[NSNumber numberWithInt:2]]; [self performSelector:NSSelectorFromString(@"move:") withObject:[NSNumber numberWithInt:2]]; //使用objc_msgSend()函数动态调用 objc_msgSend(self,@selector(move:),[NSNumber numberWithInt:2]); objc_msgSend(self, NSSelectorFromString(@"move:"),[NSNumber numberWithInt:3]); NSLog(@"正在加速%g",factor); return 100*factor; } @end
使用objc_msgSend可能报错
//objc_msgSend()报错Too many arguments to function call ,expected 0,have3

解决方法
//Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Calls  改成 NO

#import <Foundation/Foundation.h> #import <objc/message.h> #import "JQCar.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... //获得JQCar类 Class clazz = NSClassFromString(@"JQCar"); //动态创建car id car = [[clazz alloc] init]; //使用performSelector方法来动态调用 [car performSelector:@selector(addSpeed:) withObject:[NSNumber numberWithLong:2]]; //使用Objec_send来动态调用 objc_send(car,@selector(addSpeed:),3.4); //定义函数指针变量 double (*addSpeed)(id ,SEL,double); //获得car对象的addSpeed方法,再把addSpeed方法赋值给addSpeed指针变量 addSpeed = (double (*)(id,SEL,double))[car methodForSelector:NSSelectorFromString(@"addSpeed:")]; //调用addSpeed double speed = addSpeed(car, @selector(addSpeed:), 3.4); NSLog(@"加速后的速度是%g",speed); NSLog(@"Hello, World!"); } return 0; }
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生