Objective-C ,KVC研究,几种属性赋值的方法
2016-02-27 19:16
375 查看
第一篇博文,分享一下自己对KVC的理解
系统的KVC通常情况下是用来批量赋值的,使用形如
看一些情况:
系统的KVC通常情况下是用来批量赋值的,使用形如
[obj setValuesForKeysWithDictionary:dict];进行整体赋值,或者使用
[obj setValue:@"Tom" forKey:@"name"];形式进行指定成员变量的赋值。
看一些情况:
@implementation Car { @private //用private申明一个成员变量,写在@implementation中 NSString *_name; } - (NSString *)description { return [NSString stringWithFormat:@"name:%@", _name]; //因为外部无法直接访问此变量,重写description方法观察此变量变化 } @end
//为说明问题,以下不考虑内存管理以及头文件引入等细节,</span>
#import "Car.h" int main(int argc, const char * argv[]) { Car *car = [[Car alloc] init]; [car setValue:@"BMW" forKey:@"name"]; NSLog(@"%@",car); return 0; }//来观察一下打印值
name:BMW//依然给成员变量_name赋值成功了,
//注:这里不考虑手动申明禁止通过key-value方式赋值的情况</span>
//确实非常神奇,自己尝试实现一下,想到两种方法,</span></span>
//1,依赖set方法(显然不是系统的实现方式,但容易想到,也容易实现),亦可以实现部分功能</span>
@implementation NSObject(KVC) - (void)my_setValue:(id)value forKey:(NSString *)key { NSString *my_key = [key capitalizedString]; //先首字母大写
my_key = [NSString stringWithFormat:@"set%@:",my_key];//拼接字符串,方便和set方法关联 SEL sel = NSSelectorFromString(my_key); objc_msgSend(self, sel, value);//调用set方法进行赋值, }
</pre>//2,对成员变量进行直接操作,修改属性值,<pre>
- (void)my__setValue:(id)value forKey:(NSString *)key { Class cls = [self class]; /** 此行代码可获得指定key的ivar */ Ivar IVAR = class_getInstanceVariable(cls, [[NSString stringWithFormat:@"_%@", key] UTF8String]); object_setIvar(self, IVAR, value);
#if 0 //此代码段是优化前尝试用,获得思路 unsigned int outCount; Ivar *ivars = class_copyIvarList(cls, &outCount); for (int i = 0; i < outCount; i++) { Ivar ivar = ivars[i]; const char *ch = ivar_getName(ivar); NSString *ivarStr = [NSString stringWithUTF8String:ch]; NSString *keyStr = [NSString stringWithFormat:@"_%@", key]; if ([ivarStr isEqualToString:keyStr] ) { object_setIvar(self, ivar, value); // NSLog(@"%@",ivarStr ); } } #endif }//引入头文件可以达到和系统KVC一样的效果,访问私有变量
Car *car = [[Car alloc] init]; [car my__setValue:@"BMW" forKey:@"name2"]; NSLog(@"%@",car);
</pre><pre name="code" class="objc">自己的一点尝试和收获,每天多学一点,生活美好一些。<img src="http://img.blog.csdn.net/20160227205401095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
相关文章推荐
- Objective-C(4)成员变量的包装---属性
- 对Objective-C的runtime的一些理解
- Objective-C中.h文件、.m文件中@interface、@synthesize及其它
- Objective-C(3)对象间的has a关系---复合关系
- Objective-C(2)离不开的---类与对象
- Objective-C(1) 认识一下吧
- 为什么 Instantiate 克隆出来的GameObject的Scale 在 SetParent 总是放大 64倍?
- object对象、伴生类与伴生对象与类的继承实战
- Objective—C通讯录简单编程(源码)
- iOS开发系列--Objective-C之KVC、KVO
- iOS开发系列—Objective-C之内存管理
- 《基于MFC的OpenGL编程》Part3 Drawing Simple 3D objects
- Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化
- iOS 之 OBJECTC 调用C、OBJECTC调用C++
- iOS开发系列--Objective-C之协议、代码块、分类
- iOS开发系列--Objective-C之类和对象
- Objective-C中的存取方法
- 【值得收藏】线程、事件与QObject
- 推送(本地Local Notification)
- KVO探究