iOS开发——KVO/KVC&OC与Swift篇详解

Swift中使用KVC和KVO的类都必须必须继承自NSObject

KVC

  • key-value coding
  • 是1种间接访问对象的机制
  • key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型
  • KVC主要就是两个方法
  • (1)通过key设置对应的属性
  • (2)通过key获得对应的属性
  • 举例
  • class TestForKVC:NSObject{ var hwcCSDN = "hello world" } var instance = TestForKVC() var value = instance.valueForKey("hwcCSDN") as String instance.setValue("hello hwc",forKey:"hwcCSDN")

KVO

  • key-value observing
  • 建立在KVC之上的的机制
  • 主要功能是检测对象属性的变化
  • 这是1个完善的机制,不需要用户自己设计复杂的视察者模式
  • 对需要视察的属性要在前面加上dynamic关键字
  • 举例

第1步,对要视察的对象的属性加上dynamic关键字

class ToObserver:NSObject{
dynamic var hwcDate = NSDate()
func updateDate(){
hwcDate = NSDate()
}
}

第2步,声明1个全局的用来辨别是哪一个被视察属性的变量

private var mycontext = 0

第3步,在要视察的类中addObserver,在析构中removeObserver,重写observerValueForKeyPath

class TestForCSDN:UIViewController{
var testVariable = ToObserver()
override func viewDidLoad(){
super.viewDidLoad()

testVariable.addObserver(self,forKeyPath:"hwcDate",options:.New,context:&mycontext)
}

deinit{
testVariable.removeObserver(self,forKeyPath:"hwcDate")
}
overfide func
observeValueForKeyPath(keyPath:String,ofObject:AnyObject,change:[NSObject:AnyObject],context:UnsafeMutablePointer<Void>){

if(context == &mycontext){
println("Changed to:(change[NSKeyValueChangeNewKey]!)")
}
}
}

这样,就能够在函数observeValueForKeyPath检测到变化了

下面来看看OC是怎么实现KVO和KVC的

1、KVC

  • KVC(KeyValueCoding) “键-值-编码”是一种可以直接通过字符串的名字(key)来访问类实例变量的机制,是通过setter、getter方法访问。

    • 属性的访问和设置

      • KVC可以用来访问和设置实例变量的值。key是属性名称

        • 设置方式:[self setValue:aName forKey:@"name"]

          • 等同于 self.name = aName;

            • 访问方式: aString = [self valueForKey:@"name"]

              • 等同于 aString = self.name;

2、KVO 观察者

  • KVO(KeyValueObserver) “键-值-监听”定义了这样一种机制,当对象的属性值发生变化的时候,我们能收到一个“通知”。观察者更准确

    • NSObject提供了监听机制。所有子类也就全都能进行监听

      • KVO是基于KVC来实现的。
        实现监听步骤
        (1)注册监听对象。anObserver指监听者,keyPath就是要监听的属性值,而context方便传输你需要的数据,它是个指针类型。
  • -(void)addObserver:(NSObject *)anObserver

    •     forKeyPath:(NSString *)keyPath

      •       options:(NSKeyValueObservingOptio
  • ns)options
  •       context:(void *)context//(void*)是任何指针类型
  • 其中, options是监听的选项,也就是说明监听返回的字典包含什么值。有两个常用的选项:
  • NSKeyValueObservingOptionNew 指返回的字典包含新值。
  • NSKeyValueObservingOptionOld   
    指返回的字典包含旧值。

(2)实现监听方法。监听方法在Value(属性的值)发生变化的时候自动调用。

  • -(void) observeValueForKeyPath:(NSString *)keyPath
  • ofObject:(id)object
  • change:(NSDictionary *)change
  • context:(void *)context
  • 其中,object指被监听的对象。change里存储了一些变化的数据,比如变化前的数据,变化后的数据。

3、通知

  • 通知是iOS开发框架中的一种设计模式,内部的实现机制由Cocoa框架支持。
  • 通知一般用于M、V、C的间的信息传递。像我在设置页面设置App皮肤。
  • M是modol模型 V是view视图 C是control控制器。
  • 系统通知

//注册通知

  • [[NSNotificationCenter defaultCenter] addObserver:self
  • selector:@selector(didFinish:)
    //didFinish:是方法名   self
    (谁的)和  didFinish:确定方法
  • name:MPMoviePlayerPlaybackDidFinishNotification
  •  object:nil];
  • selector是方法名    
    class是描述类的类   
    SEL [email protected](方法名)
  • 通知用完要移除

//移除通知

  • [[NSNotificationCenter defaultCenter] removeObserver:self
  • name:MPMoviePlayerPlaybackDidFinishNotification
  • object:nil];

总结

这一篇就介绍了iOS开发中比较有特色的两个机制:KVC和KVO

KVC:就是可以暴力的去get/set类的私有属性,同时还有强大的键值路径对数组类型的属性进行操作

KVO:监听类中属性值变化的

时间: 2024-10-26 10:36:44

iOS开发——KVO/KVC&OC与Swift篇详解的相关文章

iOS开发——高级特性&amp;Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量

ios开发 &lt;AppName&gt;-Prefix.pch文件的用法详解

我们知道,每新建立一个工程,比如说HelloWord,在分类SupportingFiles里都会有一个以工程名开头-Prefix.pch结尾的文件,如HelloWord-Prefix.pch.对于这个文件,很长一段时间里笔者都没觉得它碍事.直到有一天笔者学习NSLog看网上的教程,大家是怎样在最终提交应用的时候,一次性将NSLog语句移除.网上大多转来转去的方法,都是说把如下的语句 #ifdef DEBUG#    define DLog(...) NSLog(__VA_ARGS__)#else

【IOS 开发】Object - C 入门 之 数据类型详解

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38544659 1. 数据类型简介及输出 (1) 数据类型简介 数据类型简介 : Object - C 数据类型 分为 基本数据类型, 构造类型 和 指针类型; -- 基本数据类型 : 整型, 字符型, 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类型, 所有

iOS开发- 版本控制SVN和Git使用详解

公司的实际开发中,在天朝使用较多的还是SVN,因为SVN是集中式的,在天朝上班你们都懂的! -----------------svn----------------- 一:最常用基本步骤--- 下载(完整下载,第一次),将服务器的项目下载到本地开始开发 svn checkout ip —uaerbane=? —password=?     //这里需要add 简:co 更新仓库,服务器项目有变动的时候需要更新到本地,以免错误或者冲突 svn updata               //这里的直

IOS开发--深拷贝与浅拷贝(mutableCopy与Copy)详解

这里主要侧重于集合类的深浅拷贝,主要事因为工作的时候遇到这个问题.有不足的地方欢迎指正,转载请注明. 首先我们需要有这样的一个前提: [array addObject:obj];这样obj的引用计数会增加1,如果使用remove则obj的引用计数会减一.ios对集合的内存处理就是这样的.那么,假设obj只被array拥有:id temp = [array objectAtIndex:0];[array removeObjectAtIndex:0];如果你再要使用temp就会出错,因为这个时候ob

iOS开发-KVO的奥秘

iOS开发-KVO的奥秘 字数2933 阅读3842 评论28 喜欢57 序言 在iOS开发中,苹果提供了许多机制给我们进行回调.KVO(key-value-observing)是一种十分有趣的回调机制,在某个对象注册监听者后,在被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作.最常见的KVO运用是监听scrollView的contentOffset属性,来完成用户滚动时动态改变某些控件的属性实现效果,包括渐变导航栏.下拉刷新控件等效果. 渐变导航栏 使用 KVO的使用

iOS开发范例实战宝典(进阶篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(进阶篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

iOS开发范例实战宝典(基础篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(基础篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

IOS应用的执行过程以及生命周期详解

iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没