iOS反射:把對象直接轉化成NSDictionary,iosnsdictionary
在IOS的網路編程中,通常我們需要將一些實體資料儲存到NSDictionary,在獲得NSDictionary後即可直接使用iOS 5後的NSJSONSerialization類型的dataWithJSONObject方法就可以返回包含JSON字串的NSData對象了。然後調用ASIHttpRequest。
如果類屬性中還包含其他類,或更多的嵌套下怎麼辦呢,自己來編寫會非常複雜,這裡我們可以通過反射來編寫,基本思路就是通過反射獲得屬性名稱,通過KVC獲得值,剩下的就是NSDictionary和NSArray的迴圈嵌套了。
IOS的反射引用<objc/runtime.h>,使用方法為class_copyPropertyList和property_getName
反射的詳細介紹官方網址:點擊
範例程式碼
#import <Foundation/Foundation.h>@interface BIDObjectToNsDictionary : NSObject+ (NSDictionary*)getObjectData:(id)obj;@end
#import "BIDObjectToNsDictionary.h"#import <objc/runtime.h>+ (NSDictionary*)getObjectData:(id)obj{ NSMutableDictionary *dic = [NSMutableDictionary dictionary]; unsigned int propsCount; objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//獲得屬性列表 for(int i = 0;i < propsCount; i++) { objc_property_t prop = props[i]; NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//獲得屬性的名稱 id value = [obj valueForKey:propName];//kvc讀值 if(value == nil) { value = [NSNull null]; } else { value = [self getObjectInternal:value];//自訂處理數組,字典,其他類 } [dic setObject:value forKey:propName]; } return dic;}+ (id)getObjectInternal:(id)obj{ if([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]] || [obj isKindOfClass:[NSNull class]]) { return obj; } if([obj isKindOfClass:[NSArray class]]) { NSArray *objarr = obj; NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count]; for(int i = 0;i < objarr.count; i++) { [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i]; } return arr; } if([obj isKindOfClass:[NSDictionary class]]) { NSDictionary *objdic = obj; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]]; for(NSString *key in objdic.allKeys) { [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];//對字典類型進行解析,遞迴調用 } return dic; } return [self getObjectData:obj];//對其他class解析,遞迴調用@end
參考原文http://ios.9tech.cn/news/2013/0918/28899.html