首页 / IOS / IOS开发反射和动态调用总结
IOS开发反射和动态调用总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了IOS开发反射和动态调用总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2517字,纯文字阅读大概需要4分钟。
内容图文
和java一样,Object-C也提供了反射的机制。每一个类都有一个Class,获取Class有以下三种方法。
// 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-28 17:03:18.907 反射[1322:303] clazz的类型是NSString
2015-04-28 17:03:19.279 反射[1322:303] __NSCFConstantString
2015-04-28 17:03:19.280 反射[1322:303] 1
2015-04-28 17:03:19.281 反射[1322:303] Hello, World!
Program ended with exit code: 0
打印出来的结果是这样,_NSString只是类簇的前端而已
**/
对与第一种和第二种方式,都是根据类获取Class对象,比较之下,第一种代码安全性更高,程序再编译阶段就可以检测所需要访问的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; }
原文:http://blog.csdn.net/zhouzhoujianquan/article/details/45370379
内容总结
以上是互联网集市为您收集整理的IOS开发反射和动态调用总结全部内容,希望文章能够帮你解决IOS开发反射和动态调用总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。