[RunTime练习二]属性的遍历
2016-01-10 16:53
253 查看
#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> @interface MyTestObj : UIButton @property (nonatomic,retain) NSNumber* MyNumber; @property (nonatomic) NSInteger MyInteger; @property (nonatomic, readwrite, copy) NSString* MyString; @property (nonatomic,retain)NSMutableArray* MyArray; @property (nonatomic,retain)NSMutableDictionary* MyDictionary; @end
#import "MyTestObj.h" @implementation MyTestObj -(instancetype) init { if (self = [super init]) { self.MyArray = [[NSMutableArray alloc] initWithObjects:@"hello", nil]; self.MyDictionary = [[NSMutableDictionary alloc]initWithCapacity:1]; [self.MyDictionary setObject:@"hello" forKey:@"world"]; self.MyString = @"hello world"; self.MyNumber = [NSNumber numberWithInteger:100]; self.MyInteger = 80; } return self; } @end
#import "ViewController.h" #import "MyTestObj.h" #import <objc/runtime.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; MyTestObj* M = [[MyTestObj alloc] init]; NSInvocation* invoc ; unsigned PropertiesCount = 0; objc_property_t* properties = class_copyPropertyList([M class], &PropertiesCount); for (int i = 0; i < PropertiesCount; i++) { @autoreleasepool { objc_property_t prop = properties[i]; NSString* propName = [NSMutableString stringWithFormat:@"%s",property_getName(prop)]; SEL s = NSSelectorFromString(propName); //sign和invoc都只能通过类方法得到(可能有别的,我不太清楚~),写在for循环里面浪费了~~ NSMethodSignature* sign = [[M class] instanceMethodSignatureForSelector:s]; invoc = [NSInvocation invocationWithMethodSignature:sign]; [invoc setSelector:s]; [invoc setTarget:M]; [invoc invoke]; if (strcmp([sign methodReturnType], @encode(void)) == 0) { NSLog(@"Return None~"); } else if (strcmp([sign methodReturnType], @encode(NSInteger)) == 0) { void* pValue = (void*)malloc([sign methodReturnLength]); [invoc getReturnValue:pValue]; id result = [NSNumber numberWithInteger:*((NSInteger*)pValue)]; NSLog(@"Ruturn NSInteger %@",result); } else { void* pValue = (void*)malloc([sign methodReturnLength]); [invoc getReturnValue:&pValue]; id result = (__bridge id)pValue; NSLog(@"Return object %@",result); } } } // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }
1,可以遍历对象对应类的某一层次的所有属性(只写属性没考虑~)。
2,instanceMethodSignatureForSelector,不仅能获取方法的签名,也能获取属性的签名,再次印证了,@property声明的属性,读取方法就是属性名。
3,nsinvocation在调用的时候,即使是返回值,也会release,所以如果不申请内存,来放返回值,那么oc对象的引用计数就混乱了。retainArguments只retain了参数。
上面的这些操作完全是为了巩固下nsinvocation的用法,获取属性值,完全可以用[M ValueForKey:propName]来完成~~
参考:http://www.cnblogs.com/pengyingh/articles/2359199.html
相关文章推荐
- Android开发修炼——我的java学习 Day04
- 【spring配置】——spring aop配置
- 20.5 线程本地存储
- uva272
- 用结构体变量和结构体变量的指针做参数函数
- (已测)【ASP.NET 基础】图片上传和显示
- orm2 中文文档 4.3 extendsTo(一对一关系)
- (转)网页头部<meta name="Robots" 用法 <meta>系列用法.
- 向每一个错误致敬——导入第三方库遇到的坑
- JavaScript进阶(四)js字符串转换成数字的三种方法
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
- python项目之 英汉词典 带GUI tkinter
- Android绘图机制(四)——自定义View的实战演示
- JavaScript进阶(四)js字符串转换成数字的三种方法
- 2. RMI的jdk的实现
- git使用教程
- Android自己定义控件:老版优酷的三级菜单(效果图 + Demo)
- (七)Android中AIDL的应用与理解
- 模式识别---图像二值化
- zookeeper集群配置安装