iOS_KVC与KVO
#import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
NSInteger _age;
Person *_wife;
}
@end
#import "ViewController.h"
#import "Person.h"
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//创建对象
Person *person = [[Person alloc]init];
//使用KVC来存储对象的数据成员
[person setValue:@"Tom" forKey:@"_name"];
[person setValue:@ forKey:@"_age"];
NSLog(@"person:%@",person);
//取对象的数据成员
NSString *name = [person valueForKey:@"_name"];
NSInteger age = [[person valueForKey:@"_age"]integerValue];
NSLog(@"KVC方式存取:name:%@,age:%ld",name,age); }
@end
如果需要打印输出对象,还需要重写Person类的descaprition方法。
#import "Person.h" @implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
}
@end
3、扩展KVC的使用
Book类的.h文件 #import <Foundation/Foundation.h> @interface Book : NSObject
@property(copy,nonatomic)NSString *bookName; @end Book类的.m文件
#import "Book.h" @implementation Book
-(NSString *)description
{
return [NSString stringWithFormat:@"%@",_bookName];
}
@end
Person类的.h文件 #import <Foundation/Foundation.h>
@class Book;
@interface Person : NSObject
@property(copy,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(strong,nonatomic)Book *book;
@end Person类的.m文件
#import "Person.h" @implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
}
@end
最后是实现文件。
#import "ViewController.h"
#import "Book.h"
#import "Person.h"
@interface ViewController () @end
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Person *p1 = [[Person alloc]init];
[p1 setValue:@"Tom" forKey:@"name"];
[p1 setValue:@ forKey:@"age"];
Book *book1 = [[Book alloc]init];
book1.bookName = @"iPhone";
p1.book = book1; Person *p2 = [[Person alloc]init];
[p2 setValue:@"Jerry" forKey:@"name"];
[p2 setValue:@ forKey:@"age"];
Book *book2 = [[Book alloc]init];
book2.bookName = @"iOS";
p2.book = book2; NSLog(@"%@%@",p1,[p2 valueForKeyPath:@"name"]); NSArray *person = @[p1,p2];
NSLog(@"%@",person); NSArray *arrayM = [person valueForKeyPath:@"book.bookName"];
NSLog(@"%@",arrayM);
} @end
#import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
}
@end
#import "Person.h" @implementation Person
//接受被观察者发生变动后的通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@,%@,%@,%@",keyPath,object,change,context);
}
@end
再添加一个股票类,让Person作为观察者,对股票的价格进行监听。
#import <Foundation/Foundation.h> @interface Stock : NSObject
{
NSString *_name;
float _price;
}
@end
实现文件内容:
#import "ViewController.h"
#import "Person.h"
#import "Stock.h"
@interface ViewController ()
@property(strong,nonatomic)Person *person;
@property(strong,nonatomic)Stock *stock;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//创建观察者
self.person = [[Person alloc]init];
[self.person setValue:@"Tom" forKey:@"_name"]; //创建股票
self.stock = [[Stock alloc]init];
[self.stock setValue:@"sxt" forKey:@"_name"];
[self.stock setValue:@1.2 forKey:@"_price"]; //设置观察者
[self.stock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"add"];
}
//单击按钮让股票价格加1
- (IBAction)buttonClicked:(UIButton *)sender
{
float price = [[self.stock valueForKey:@"_price"]floatValue];
[self.stock setValue:@(price+1.0) forKey:@"_price"];
} -(void)dealloc
{
//删除观察者
[self.stock removeObserver:self.person forKeyPath:@"_price"];
}
@end
iOS_KVC与KVO的更多相关文章
- iOS---观察者模式之--->KVO
文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notifica ...
- Objective-C之KVC、KVO
1,KVC(键值编码) Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...
- OS 如何选择delegate、notification、KVO?
原文链接:http://blog.csdn.net/dqjyong/article/details/7685933 前面分别讲了delegate.notification和KVO的实现原理,以及实际使 ...
- KVC 和 KVO
KVC 键值编码 全称是Key-value coding,翻译成键值编码.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. 1.通过key(成员变量的名称)设置 ...
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
- KVO __ 浅谈
KVO :Key-Value Observing 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. ...
- iOS开发系列--Objective-C之KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
- delegate、notification、KVO场景差别
delegate: 编译器会给出没有实现代理方法的警告 一对一 使用weak而不是assign,或者vc消失时置为nil 可以传递参数,还可以接收返回值 notification: 编译期无法排错 一 ...
- IOS学习之初识KVO
什么是KVO? KVO(Key-Value Observing)键值观察,是一种通过对对象的某一个属性添加观察者,一旦这个属性值发生变化,就会通知当前观察者的一种机制. 该如何使用? 1.注册,指定被 ...
随机推荐
- KMP hihoCoder1015 KMP算法
人太蠢,,看了一天的KMP.. 刚開始看训练指南的,,后来才惊奇的发现原来刘汝佳写的f数组并非Next数组! 总认为和之前看过的全然不一样.. . 后来又百度了一下KMP,研究了非常久,然后用自己的逻 ...
- ios - UINavigationBar添加背景图片的几种简单思路
UITabBarController下面常常需要为多个ViewController设置导航栏样式,总结了一下遇到过的为UINavigationBar添加背景图片的几种简单思路 以设置背景图片为例: 第 ...
- MySQL中的聚合函数
创建student表 CREATE TABLE IF NOT EXISTS `student` ( `id` int(4) unsigned NOT NULL AUTO_INCREMENT, `nam ...
- 如何修改vs2005/vs2010的tfs的登录名和密码 .
如何修改vs2005/vs2010的tfs的登录名和密码 . 连接TFS时,如果本机保存了用户的网络密码,不会出现用户名和密码的输入框,若要更换TFS的用户名和密码,需按以下步骤操作: 控制面板--- ...
- iOS学习笔记(七)——UI基础UIButton
前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...
- 十六进制字符串 char 数组 转换 c/c++/java
转载自:http://qing.blog.sina.com.cn/1820422183/6c81702733001qvk.html 1.c版 int hexcharToInt(char c) { ...
- 1052 最大M子段和(DP)
1052 最大M子段和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个 ...
- Xamarin.Forms学习之XAML命名空间
大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...
- 字符串 转 时间戳 unix_timestamp('2018-07-01 0:0:0')
SELECT FROM_UNIXTIME(createtime,'%Y%m%d') AS d, s.app,SUM(o.val) FROM orders o LEFT JOIN app_type s ...
- cron_action
crontab using shell script to automate linux system maintenance tasks Linux中用crontab例行工作安排_Linux教程 ...