文档章节

iOS反射机制(转)

sea_god
 sea_god
发布于 2015/01/22 19:03
字数 304
阅读 387
收藏 11

iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值。(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性。

本人常用的反射方式,有如下两种:

  1. 从一个自定义实体类->自定义实体类

  2. 从一个NSDictionary->自定义实体类(此方式最最常用,如网络Json数据会组成NSDictionary。sqlite查询数据,可以用第三方组件组成NSDictionary

直接上码,(这里码在NSObject类别中)

获取对象所有属性:

- (NSArray*)propertyKeys

{

    unsigned int outCount, i;

    objc_property_t *properties = class_copyPropertyList([self class], &outCount);

    NSMutableArray *keys = [[NSMutableArray allocinitWithCapacity:outCount];

    for (i = 0; i < outCount; i++) {

        objc_property_t property = properties[i];

        NSString *propertyName = [[NSString allocinitWithCString:property_getName(property)encoding:NSUTF8StringEncoding];

        [keys addObject:propertyName];

    }

    free(properties);

    return keys;

}


- (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource

{

    BOOL ret = NO;

    for (NSString *key in [self propertyKeys]) {

        if ([dataSource isKindOfClass:[NSDictionary class]]) {

            ret = ([dataSource valueForKey:key]==nil)?NO:YES;

        }

        else

        {

            ret = [dataSource respondsToSelector:NSSelectorFromString(key)];

        }

        if (ret) {

            id propertyValue = [dataSource valueForKey:key];

            //该值不为NSNULL,并且也不为nil

            if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {

                [self setValue:propertyValue forKey:key];

            }            

        }

    }

    return ret;

}


/////使用方法

NSDictionary *dicJsonData;

EntityObject *objValue;

[objValue reflectDataFromOtherObject:dicJsonData];//这样就可以完成对象的自动赋值了,


本文转载自:http://blog.csdn.net/shulianyong/article/details/9060825

sea_god
粉丝 5
博文 24
码字总数 1938
作品 0
海淀
程序员
私信 提问
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
2018/09/01
0
0
Vue开发微信H5 微信分享签名失败问题解决方案

关于Vue中路由使用history模式,开发微信H5页面分享时在安卓上签名有效成功,但是在IOS设备上一直报错签名失效问题 问题描述:在Vue开发过程中,路由使用History模式下,在使用微信分享时,在...

golddemon
2018/08/08
0
0
最简单的基于FFmpeg的移动端例子:IOS 视频转码器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/47072673 ===================================================== 最简单的...

雷霄骅
2015/08/01
0
0
iOS 开发之一些著名开发者博客

国内 王巍 王巍目前在日本横滨任职于 LINE。工作内容主要进行 Unity3D 开发,8小时之外经常进行 iOS/Mac 开发。他的陈列柜中已有多款应用,其中番茄工作法工具非常棒。 博客 池建强 池建强,...

maskmale
2018/02/25
0
0
转: ios与android语音互通方案,类微信

Ios实现amr编解码 Feb 5th, 2012 介绍 学习ios第一个练手功能就是给已有产品加上语音通信功能,能够互通ios与android。这里给出自己的一些心得,希望能给他人一些参考。 资料搜集与参考 类似...

天下杰论
2014/10/30
307
0

没有更多内容

加载失败,请刷新页面

加载更多

【2019个推开发者节】航母级APP都在用的SDK现在全部免费,35岁老程序员表示第一次见!

1024程序员节来了 双11近了 各路满减、折扣、领券、秒杀、集赞 营销玩法猛于虎,一看优惠两毛五 日常拼命赶“需求” 修“Bug”的开发者们 想找个好用又不贵的工具太难了 亲爱的开发者们,不要...

个推
30分钟前
9
0
Ceph对可用存储空间的校验与控制

Ceph一共使用了四个配置对可用存储空间进行校验并实施控制,如下: mon_osd_full_ratio:集群中的任一OSD空间使用率大于等于此数值时,集群将被标记为Full,此时集群将停止接受来自客户端的写...

浪里个浪浪
31分钟前
11
0
工厂方法模式

1.定义:创建一个接口,协助创建其它对象 2.优缺点 优: a.用户只需要知道这个工厂是创建哪种对象的,不需要知道创建的过程 b.满足开闭原则(开闭原则:对扩展开放,对修改关闭,即增加类可以...

wen123
33分钟前
5
0
Bootstrap Table -detailView和detailFilter的使用

查看表格 detailFilter 属性:data-detail-filter Type:Function Default:function(index,row){ return true} detailView 属性:data-detail-view Type:Boolean Default:false <table id="ta......

tianyawhl
37分钟前
4
0
场效应管的注意事项

  (1)为了安全使用场效应管,在线路的设计中不能超过管的耗散功率,最大漏源电压、最大栅源电压和最大电流等参数的极限值。   (2)各类型场效应管在使用时,都要严格按要求的偏置接入...

仙溪
40分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部