A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

大家的博客是在哪里创建的? 163、sina、 CSDN 有区别么? 哪个会好一些?

QQ截图20150103182625.jpg (79.16 KB, 下载次数: 30)

审批意见

审批意见

评分

参与人数 1黑马币 +5 收起 理由
shicuf + 5 不懂就问,继续努力!

查看全部评分

12 个回复

倒序浏览
小平 来自手机 中级黑马 2015-1-3 18:54:38
沙发
都可以,哪个能发博客就可以
回复 使用道具 举报
小平 发表于 2015-1-3 18:54
都可以,哪个能发博客就可以

谢谢你~其实是刷黑马币的  哈哈
回复 使用道具 举报
哈哈   好笑
回复 使用道具 举报

哈哈哈哈哈
回复 使用道具 举报
楼主好坏,狼来了,狼来了。。。
回复 使用道具 举报
shicuf 发表于 2015-1-10 22:46
楼主好坏,狼来了,狼来了。。。

少年看你黑马币多,不妨送我些可好?:lol
回复 使用道具 举报
shicuf 中级黑马 2015-1-10 22:52:59
8#
张传宾 发表于 2015-1-10 22:49
少年看你黑马币多,不妨送我些可好?

让版主发现直接给你清零,你还敢要吗?多逛逛论坛,黑马币总会有的
回复 使用道具 举报
shicuf 发表于 2015-1-10 22:52
让版主发现直接给你清零,你还敢要吗?多逛逛论坛,黑马币总会有的

要不你象征性的问我个问题,我象征性的回答你,然后你一开心,给我好多黑马币。。。。。怎么样?
回复 使用道具 举报
张传宾 发表于 2015-1-10 22:55
要不你象征性的问我个问题,我象征性的回答你,然后你一开心,给我好多黑马币。。。。。怎么样? ...

那你来谈谈对OC运行时机制的理解以及如何使用?
回复 使用道具 举报
shicuf 发表于 2015-1-10 22:57
那你来谈谈对OC运行时机制的理解以及如何使用?

由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法。利用runtime机制让我们可以在程序运行时动态修改类、对象中的所有属性、方法。

  下面就介绍运行时一种很简单的使用方式,将字典对象转为模型。当然,你可能会问,我用KVO直接调用 setValuesForKeysWithDictionary:方法,传入一个字典一样可以快速将字典转模型啊,但是这种方法有它的弊端,只有遍历某个模型中所有的成员变量,然后通过成员变量从字典中取出对应的值并赋值最为稳妥,否则,当模型中的属性数量与字典中的key的数量不一样时,就会报错。而且,由于runtime是更底层的语言,我们编写的OC代码在运行时,编译器内部会先转为C和C++的代码,然后再执行,因而运用runtime机制,程序的性能也会更好。说了这么多,下面就初步认识一下runtime的强大。

  首先,我们定义一个类

复制代码
@interface Person : NSObject{
    CGFloat height;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, assign) int no;

@end
复制代码
  然后,我们在其它文件中使用这个类,注意在使用之前,要包含 #import <objc/message.h>

下面通过一小段代码来获取到上面这个类中所有的成员变量

复制代码
unsigned int outCount = 0;
    Ivar *vars = class_copyIvarList([Lender class], &outCount); // 获取到所有的成员变量列表
   
    // 遍历所有的成员变量
    for (int i = 0; i < outCount; i++) {
        Ivar ivar = vars; // 取出第i个位置的成员变量
        
        const char *propertyName = ivar_getName(ivar); // 获取变量名
        const char *propertyType = ivar_getTypeEncoding(ivar); // 获取变量编码类型
        printf("---%s--%s\n", propertyName, propertyType);

    }
复制代码
打印结果:

---height--f
---_name--@"NSString"
---_age--@"NSNumber"
---_no--i

可见,通过上面几句简单的代码就可以获取到某个类中所有变量的名称和类型,然后通过object_setIvar()方法为具体某个对象的某个成员变量赋值。
回复 使用道具 举报 1 0
张传宾 发表于 2015-1-10 23:00
由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法。利用runtime ...

其实你还没说到重点,并且牵扯到kvc,不知道你是不是真的理解。我知道你是去百度了,不过希望你能不懂就问,这样才能进步。
回复 使用道具 举报
shicuf 发表于 2015-1-10 23:04
其实你还没说到重点,并且牵扯到kvc,不知道你是不是真的理解。我知道你是去百度了,不过希望你能不懂就 ...

嗯..你是个好人....我还没开始看OC ,但我会努力的! 谢谢你。。。其实刚才也是跟你开个玩笑,没想到你这么认真。。。。惭愧呀。。。我会加油的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马