今天对Objective-C中的Runtime了解了下。第一感觉就是跟java中反射很像,原来就是同一性质的东西。Runtime是底层的C语言。可以动态的获取或修改类的方法、属性,动态创建类、类的属性、类的方法等。其实Objective-C在许多实现方面还是在很依赖C的。C还是有毕要再回顾下了。下面就是Runtime获取属性和方法相关代码(需导入#import <objc/runtime.h>):
#import <Foundation/Foundation.h> #import <objc/runtime.h> @interface RuntimeVo : NSObject @property(nonatomic,assign) int mid; @property(nonatomic,strong) NSString *name; @property(nonatomic,strong) NSString *school; - (void) getAttributes; - (void) getMethods; @end
#import "RuntimeVo.h" @implementation RuntimeVo //获取属性 - (void) getAttributes{ unsigned int count = 0; Ivar *ivars = class_copyIvarList([RuntimeVo class], &count); for (int i=0; i<count; i++) { //获取i位置对应的成员变量 Ivar ivar = ivars[i]; //查看成员变量 const char *name = ivar_getName(ivar); NSString *key = [NSString stringWithUTF8String:name]; id value = [self valueForKey:key]; NSLog(@"key=%@, value====%@",key,value); } } //获取方法 - (void) getMethods{ unsigned int count = 0; Method *method = class_copyMethodList([RuntimeVo class], &count); for (int i=0; i<count; i++) { SEL name = method_getName(method[i]); NSString *strName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding]; NSLog(@"Method name === %@",strName); } } @end
- (void)viewDidLoad { [super viewDidLoad]; RuntimeVo *runVo = [[RuntimeVo alloc] init]; runVo.mid = 1; runVo.name = @"测试"; runVo.school = @"中山"; [runVo getAttributes]; [runVo getMethods]; }
输出结果为:
2015-07-02 18:36:19.498 Test101[6003:146995] key=_mid, value====1 2015-07-02 18:36:19.499 Test101[6003:146995] key=_name, value====测试 2015-07-02 18:36:19.499 Test101[6003:146995] key=_school, value====中山 2015-07-02 18:36:19.499 Test101[6003:146995] Method name === setMid: 2015-07-02 18:36:19.499 Test101[6003:146995] Method name === setSchool: 2015-07-02 18:36:19.499 Test101[6003:146995] Method name === getAttributes 2015-07-02 18:36:19.499 Test101[6003:146995] Method name === getMethods 2015-07-02 18:36:19.499 Test101[6003:146995] Method name === mid 2015-07-02 18:36:19.500 Test101[6003:146995] Method name === school 2015-07-02 18:36:19.500 Test101[6003:146995] Method name === .cxx_destruct 2015-07-02 18:36:19.500 Test101[6003:146995] Method name === name 2015-07-02 18:36:19.500 Test101[6003:146995] Method name === setName: