swift 中的KVO用法

做了4年iOS开发 凭着这个面试题 我从10K到20K 1、NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找;NSArray查找需要遍历 NSSet通过anyObject访问元素,NSArray通过下标访问 2、NSHashTable与NSMapTable? NSHashTable是NSSet的通用版本,对元素弱引用,可变类型;可以在访问成员时copy NSMapTable是NSDictionary的通用版本,对元素弱引用,可变类型;可以在访问成员时copy (注:NSHashTab 阅读详情

swift 中的KVO用法


原文地址:http://blog.youkuaiyun.com/riven_wn/article/details/62044727

KVO
KVO (Key-Value Observing)
KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现。也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。
KVO 实现机制
KVO 的实现也依赖于 Objective-C 强大的 Runtime 。

例:监听 button 的 backGroundColor 属性

import UIKit
class ViewController: UIViewController {

@IBOutlet var btn: UIButton!

var myContext:NSObject!

override func viewDidLoad() {
super.viewDidLoad()
myContext = NSObject()

btn.addObserver(self, forKeyPath: "backgroundColor", options: .new, context: &myContext)
}

@IBAction func btnClicked(_ sender: Any) {
btn.backgroundColor = UIColor.red
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if context == &myContext {
if let newValue = change?[NSKeyValueChangeKey.newKey] {
print("Date changed: \(newValue)")
}
} else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}

deinit {
btn.removeObserver(self, forKeyPath: "titleColor", context: &myContext)
}

}

点击button,打印结果:
Date changed: UIExtendedSRGBColorSpace 1 0 0 1

属性观察器
1、简单介绍

属性观察器相当于內建的KVO,监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。

可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。

注意:

不需要为无法重载的计算属性添加属性观察器,因为可以通过 setter 直接监控和响应值的变化。

2、监测方式

可以为属性添加如下的一个或全部观察器:

willSet在设置新的值之前调用
didSet在新的值被设置之后立即调用
分析:

willset观察器会将新的属性值作为固定参数传入,在willSet的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称

newValue表示。类似地,didSet观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名oldValue。

注意:

willSet和didSet观察器在属性初始化过程中不会被调用,它们只会当属性的值在初始化之外的地方被设置时被调用。

class PropertyObserverExmple {
    var number: Int = 0 {
        willSet(newNumber) {
            print("About to change to \(newNumber)")
        }
        didSet(oldNumber) {
            print("Just changed from \(oldNumber) to \(self.number)")
        }
    }
}

var observer = PropertyObserverExmple()
observer.number = 4

打印结果:
About to change to 4
Just changed from 0 to 4

swift-iOS安全的KVO操作解决由于添加了KVO忘记移除或者多次移除导致的崩溃问题 iOS安全的KVO操作,解决由于添加了KVO忘记移除,或者多次移除导致的崩溃问题 立即下载

相关推荐

Swift5.2 KVO

Swift5.2 KVO

iOS——KVO底层学习

* 添加观察者方法 */// 确认观察者实现了 observeValueForKeyPath:ofObject:change:context: 方法return;// 如果没有实现该方法,直接返回// 加锁// 获取路径信息if (pathInfo == nil) // 如果路径信息为空// 创建新的路径信息// 复制路径字符串,使用不可变对象作为键// 插入路径信息到路径映射表// 释放路径信息// 释放路径字符串// 获取观察者数量。

m0_73348697的博客 1427

锐捷交换机配置SSH

锐捷交换机配置ssh 一、组网需求 通过ssh功能可以远程登录管理设备 二、配置步骤 全局开启ssh服务,并且指定ssh版本 Ruijie>enable Ruijie#configure terminal Ruijie(config)#enable service ssh-server ------>开启SSH服务,默认关闭 Ruijie(config)#ip ssh version 2 ------>默认1.99版本,设置为版本2 添加登

Loners_fan的博客 1万+

Swift iOS:KVO

KVO是Key Value Observer的缩写,可以用于监视一个对象的属性值变化,然后执行一个代码块(块、函数、闭包等)。Facebook开源了一个KVO框架,KVOController。 这个案例使用KVOController,用于App主题改变通知。通过KVO监视主题的值,当设置主题变化时,通知所有的UI类的主题处理器。代码如下: import UIKit import KVOContro...

weixin_34250709的博客 243

UCOS-III 系统移植

UCOSIII系统移植到GD32F303详细过程 工程代码:https://github.com/jslaobing/techIot_ucosiii_porting

TechIoT - 探索物联网与嵌入式系统 2087

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 209

ios swift kvo代码示例

文章目录1.示例代码2.监听不回调问题 1.示例代码 class PersonKVO: NSObject { @objc dynamic var name = "li" @objc dynamic var age = 12 } class ViewController: UIViewController { var person: PersonKVO = PersonKVO() @IBAction func btnClick(_ sender:

baidu_40537062的博客 440

SAP FIORI静态磁贴从零到一:配置实战与权限打通

本文详细介绍了SAP FIORI静态磁贴的配置流程与权限管理,从准备工作到后台配置、目标映射、前台组织及权限分配,提供了实战技巧与常见问题解决方案。重点解析了静态磁贴的创建、目标映射配置及权限打通等关键步骤,帮助用户快速掌握FIORI静态磁贴的配置方法。

weixin_29266647的博客 249

Swift - KVO

KVO(Key-Value Observing)是Cocoa 中公认的最强大的特性之一,但是同时它也以“烂到家”的API 和极其难用著称。和属性观察不同,KVO 的目的并不是为当前类的属性提供一个钩子方法,而是为了其他不同实例对当前的某个属性(严格来说是 keypath)进行监听。其他实例可以充当一个订阅者的角色,当被监听的属性发生变化时,订阅者将得到通知。 这是一个功能很强大的属性,通过KVO 我们可以实现很多松耦合的结构,是代码更加灵活和强大,像通过监听model 的值来自动更新UI 的绑定这样的工作,

HumorousGhost 1609

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

LSCM最小二乘保角参数化

LSCM最小二乘保角参数化 最小二乘思想 已知一组点的数据(x,y) x x1x_1x1​ x2x_2x2​ x3x_3x3​ … xnx_nxn​ y y1y_1y1​ y2y_2y2​ y3y_3y3​ … yny_nyn​ 可以近似为线性关系 y=ax+by=ax+by=ax+b ,目标为确定常数 aaa , bbb ; 解法:找到 aaa , bbb ,使得所有 yiy_iyi​ 与 axi+bax_i+baxi​+b 偏差的平方和 Q=∑i=1n(yi−axi−b)2 Q=\s

weixin_49732532的博客 4252

学习swift 《kvc和kvo的简单使用》

kvc和kvo我是对照着ios写的,有什么不对的地方多多指教 先建两个简单的model类,Animal类和dog类没有任何继承关系 如下: import UIKit class Animal: NSObject {     var name:String = ""     var dog:Dog?          var arr = NSMutableArray(

xuyushiguang的博客 885

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

十一、无事勿扰,有事通知(2)——KVO

概述 Key-Value-Observe,简称KVO,和上节介绍的Notification师出同门,主要目的都是为了实现观察者模式。 虽说是同门师兄弟,但是各自精通的技艺却是各不相同的。 不像Notification,KVO没有所谓“Center”的角色,观察者和被观察者之间是直接交互的,没有第三者插脚。这个特点带来的最直接的好处就是,KVO比Notification更加的简单易用。阴阳相随...

weixin_30606461的博客 110

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

语法补充

/* 断言: 当程序发生异常时, 如果希望找到出错位置并打印一个消息, 就可以使用断言, 即通过一个全局的函数 assert assert 接受一个闭包作为其第一个参数, 第二个参数是一个字符串; 假如第一个闭包返回的是一个false, 那么这个字符串就会被打印到中控制台上, assert格式如下: */ //assert(()-> Bool, "Message") ...

dlo8147的博客 133

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

swift语言的学习笔记八(保留了许多OC的实现)

尽管swift作为一门新语言,但还保留了许多OC的机制,使得swift和OC更好的融合在一起。如果没有OC基础的先GOOGLE一下。 如:KVO,DELEGATE,NOTIFICATION。 详见DEMO。 [cpp] view plaincopy import Foundation      @objc   // 需要打开o

程序猿GTC 894

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Observable-Swift高级技巧:链式观察与事件订阅的最佳实践

Observable-Swift是一款为Swift开发者打造的KVO(键值观察)框架,提供了简洁高效的数值观察和事件处理能力。本文将分享Observable-Swift中链式观察与事件订阅的实用技巧,帮助开发者更优雅地处理数据流变化。 ## 一、快速上手:Observable的基础订阅方法 Observable-Swift的核心功能是对数值变化的观察,通过简单的订阅机制即可实时响应数据更新。在

gitblog_00833的博客 373

从此刻开始拥抱 Swift 3.0

从此刻开始拥抱 Swift 3.0

u012903898的博客 2392

2020年面向iOS开发的知识点总结(持续更新中)

前言: 最近在整理自己的技术栈,收集了一些自己认为比较重要的知识点分享给大家。 Runloop 1.iOS中触摸事件传递和响应原理 2.为什么只有主线程的runloop是开启的 3.为什么只在主线程刷新UI 4.PerformSelector和runloop的关系 5.GCD 在Runloop中的使用? 6.AFNetworking 中如何运用 Runloop? Runtime 1.Category 的实现原理? 2.isa指针的理解,对象的isa指针指向哪里?isa指针有哪两种类型? 3.Objectiv

syh96123的博客 506

KVOController:iOS与OS X现代线程安全键值观察库全解析

你是否还在为iOS和OS X开发中的键值观察(Key-Value Observing,KVO)而烦恼?原生KVO代码冗长、容易出错且线程不安全?本文将全面解析KVOController,这是一个由Facebook开发的开源库,旨在提供简单、现代且线程安全的键值观察解决方案。读完本文,你将了解KVOController的核心优势、基本用法、高级特性以及如何在项目中集成使用。 ## 什么是KVOCo...

gitblog_01096的博客 372

RxSwift文档一(简介)

简介 Rx是通过接口(Observable)表示的通用抽象的计算。 RxSwift是Rx的Swift版本。 它试图尽可能多地从原始版本移植概念,但是为了更好地与iOS/macOS环境集成,对一些概念进行了调整。 可以在ReactiveX.io上找到跨平台的文档。 与原始Rx一样,它的目的是使异步操作、事件和数据流易于组合。 KVO观察、异步操作和流都在序列(sequence)的抽象下统一。这就是Rx如此简单、优雅和强大的原因。 结构 RxSwift包含五个独立的组件,具体如下: ┌─────────────

jiuchabaikaishui的专栏 555

终极指南:如何使用KVOController构建高效iOS应用——全球开发者分享的10个最佳实践

KVOController是Facebook开源的一个强大的键值观察框架,它简化了iOS和OS X应用中的KVO实现,提供了线程安全、简单易用的API。本文汇总了全球开发者在使用KVOController时的最佳实践,帮助你避免常见陷阱,提升应用性能和稳定性。 ## 为什么选择KVOController? 传统的KVO实现往往伴随着繁琐的代码和潜在的内存管理问题,而KVOController通

gitblog_01050的博客 613
上一篇: swift4官方文档中文版
下一篇: 力学动画DynamicAnimate
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值