KVC(forKey,forKeyPath)

  • KVC是Cocoa一个大招,非常牛逼。
  • 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 
    如:Person.m文件中:

@implementation Person
{
    @private
    double _height;
}

- (void)printHeight
{
    NSLog(@"height是%f", _height);
}

@end

Person.h中:

- (void)printHeight;

看我们如何修改这个height的值:

void test()
{
    Person *p = [[Person alloc] init];

[p setValue:@10.5 forKey:@"height"];
    [p printHeight];

}

就这样就能更改了这个height的值。



forKeyPath中可以利用.运算符, 就可以一层一层往下查找对象的属性 
当然 在一般的修改一个对象的属性的时候,forKey和forKeyPath,没什么区别。如:

            [p setValue:@"jack" forKey:@"name"];

[p setValue:@30 forKey:@"age"];

            [p setValue:@"jack" forKeyPath:@"_name"];

[p setValue:@30 forKeyPath:@"_age"];

一样能修改这个name和age的值。

  • 看一下若是层次结构深一点的。比如person 有dog;dog有bone 
    这个是dog的属性:

@class Bone;

@interface Dog : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) Bone *bone;

@end

这个是bone的属性:

@interface Bone : NSObject
@property (nonatomic, strong) NSString *type;

@end

我们先初始化这些对象:

    Person *p = [[Person alloc] init];
    p.dog = [[Dog alloc] init];

p.dog.bone = [[Bone alloc] init];

然后接下来我们给这个bone赋值:

            p.dog.bone.type = @"狗骨";

[p setValue:@"猪骨" forKeyPath:@"dog.bone.type"];
            [p.dog setValue:@"猪骨" forKeyPath:@"bone.type"];

[p.dog.bone setValue:@"猪骨" forKeyPath:@"type"];

  • 从这里我们可以看出,这个forKeyPath的厉害,能使用点语法,深层次的去寻找我们需要的属性
  • 我们看一下取值的时候,forKeyPath:

void test()
{
    Person *p = [[Person alloc] init];
    p.dog = [[Dog alloc] init];
    p.dog.bone = [[Bone alloc] init];

}

  • 获得数组中的每一个元素的某个属性值

比如person有很多书:

 Person *p = [[Person alloc] init];

Book *book1 = [[Book alloc] init];
        book1.name = @"ios之Ui布局";
        book1.price = 10.5;

Book *book2 = [[Book alloc] init];
        book2.name = @"ios之OC基础";
        book2.price = 18.5;

Book *book3 = [[Book alloc] init];
        book3.name = @"ios之多线程";
        book3.price = 20.5;

Book *book4 = [[Book alloc] init];
        book4.name = @"ios之内存管理";
        book4.price = 10.5;

p.books = @[book1, book2, book3, book4];

然后我们取出books数组中每一个元素的name属性值,放到一个新的数组中返回

        NSArray *names = [p valueForKeyPath:@"books.name"];

这样就能办到。 
还有一个比较牛逼的 是取得一些特殊的值,如:avg、sum

        NSNumber *avgNumber = [p valueForKeyPath:@"[email protected]"];

NSNumber *sumNumber = [p valueForKeyPath:@"[email protected]"];

所以以后我们就用forKeyPath就行了。因为这个更强大。

时间: 2024-10-06 09:38:22

KVC(forKey,forKeyPath)的相关文章

iOS KVC补充及实例

KVC 补充及实例 怎么获取值 和 修改值-–>How - (void)setValue:(id)value forKey:(NSString *)key - (id)valueForKey:(NSString *)key - (id)valueForKey:(NSString *)key //以 key 作为标示符,获取其对应的属性值 - (void)setValue:(id)value forKey:(NSString *)key //以 key 作为标示符设置其对应的属性值 - (id)v

蓝懿 iOS KVC补充及实例

vc-补充及实例">KVC 补充及实例 怎么获取值 和 修改值—–>How - (void)setValue:(id)value forKey:(NSString *)key - (id)valueForKey:(NSString *)key - (id)valueForKey:(NSString *)key //以 key 作为标示符,获取其对应的属性值 - (void)setValue:(id)value forKey:(NSString *)key //以 key 作为标示符设

iOS:KVO/KVC 的概述与使用

KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其

使用KVC

KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招.它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制. 使用 1.利用KVC可以随意修改一个对象的属性或者成员变量(私有的也可以修改). 其中,key为被修改对象的名称或者其成员变量名称. #import <UIKit/UIKit.h> @interface MainTabBarController : UITabBarController @end @implementation Mai

KVO &amp;&amp; KVC

KVO: key-value observing 当指定的对象的属性被修改后,则对象就会接受到通知. 简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者. 使用步骤: 1.注册,指定被观察者的属性(由被观察者主动添加观察自己的观察者) 2.实现回调方法 3.移除观察 使用范例: @interface StockData : NSObject { NSString * stockName; float price; } @end @implementation Sto

iOS核心笔记—KVC机制

1.KVC(键值编码) [1].什么是KVC? KVC俗称键值编码,就是可以通过一系列方法(KVC方法)根据对象的属性名称作为key值,传入具体的value值赋值给对象的属性. [2].KVC的作用 通常,当字典中的key与对象的属性名称完全相同时,这是我们能够通过使用KVC将字典中的value值设置给对象的属性:不过,切记:对象中的属性只能比字典中的key多而不能少,一旦字典中的key在对象中找不到与之对应的属性,程序崩溃:这也是KVC一个最致命的缺点. [3].KVC三种形式 key中不包含

KVC和KVO简单介绍

KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其

iOS开源库源码解析之Mantle

来自Leo的原创博客,转载请著名出处 我的StackOverflow 这个源码解析系列的文章 AsnycDispalyKit SDWebImage Mantle(本文) AFNetworking(3.0) MBProgressHud SwiftJSON MagicRecord Alamofire 前言 iOS开发中,不管是哪种设计模式,Model层都是不可或缺的.而Model层的第三方库常用的库有以下几个 JSONModel Mantle MJExtension JSON data到对象的转换原

ios开发——实用技术篇&amp;Block/KVO/通知/代理

Block/KVO/通知/代理简单介绍与使用 关于iOS开发中数据传递的方法有很多种,但是使用最多的就是这里的四种,而且我们要学会在适当的时候使用合适的方式,才能充分的提高app的性能 下面简单介绍一下这些方法的使用 Block 第一.综述 block是OC中另外一种对象和对象的通信方式,是一对一的关系,类似于delegate,而通知时一对多的关系 第二.定义block类型 int (^myBlock)(int) 第三.block的声明 mylock=^(int a) { int result