iOS反射:把對象直接轉化成NSDictionary,iosnsdictionary

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.