iOS KVO

iOS键值观察KVO实例详解 通过实例详细讲解iOS键值观察KVO的使用方法 阅读详情

本文源自https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.pdf


KVO是一种允许指定的对象在一些其他对象指定的属性改变时被通知的机制。
为了明白KVO,你首先需要明白KVC。

At a Glance
KVO是一种允许指定的对象在一些其他对象指定的属性改变时被通知的机制。它在你应用程序的模型和控制器交互时显得特别有用。一个控制器对象典型的观察模型的属性,视图对象通过控制器观察模型对象。并且,一个模型对象可能观察其他的模型对象或者观察它自己。

你可以观察简单的属性,一对一的关系,一对多的关系 。指定的类型发生改变时多个观察的对象都会被通知的,以及那些参与改变的对象。

有三步来对一个属性设置观察者。明白以下三步可以提供一个清晰的阐述KVO是如何工作的。
1.首先,看是否有一个情景来让KVO产生好处。比如,一个对象需要在另外一个对象指定的属性发生改变时被通知。
比如,一个PersonObject可能希望在BankObject中的accountBalance改变时被通知。

2. PersonObject必须注册成BankObject属性的accountBalance的观察者,通过发送 addObserver:forKeyPath:options:context:  消息。
[bankInstance addObserver:personInstance forKetPath:@“accountBalance” option:NSKeyValueObservingOptionNew context:NULL];
注意:这个方法建立了一个你指定对象之间的链接。链接仅仅是建立在指定的实例之间,没有建立类之间的链接

3. 为了响应更改的通知,观察者必须实现observeValueForKeyPath:ofObject:change:context:方法。这个方法的实现定义了观察者应该如何响应更改通知。这个方法你可以自定义你为一个观察属性的响应。

4. 方法 observeValueForKeyPath:ofObject:change:context是在观察的属性值发生改变时以KVO遵从的方式自动调用的。

KVO的主要优势是你不需要实现你自己的调度在属性变化时发送通知。它完美的定义的基础有一个框架层面的支持来简单的适应,不需要在你的项目中添加任何代码。并且,基础已经有比较丰富的特性,可以很简单的来对一个属性支持多个观察者,以及相关的值。

KVO Compliance描述了自动和手动KVO观察的不同并且如何实现它们。
根用NSNotificationCenter的通知不同的是,KVO没有中央对象为所有的观察者提供更改通知。相反,当更改发生时,通知被直接发送给这些观察者对象。NSObject提供了这个KVO基础的实现,你很少需要重写这样方法。

Registering for Key-Value Observing(注册为键值对观察)
为了接收一个属性的键值观察的通知,三件事情是需要做的:
1. 你希望观察的被观察的类的属性必须是键值观察兼容的。
2. 你必须用被观察的对象来注册观察者,使用方法
addObserver:forKeyPath:options:context
3. 被观察的类必须实现 observeValueForKeyPath:ofObject:change:context: .
重点:不是所有的类的所有属性都是键值观察兼容的。你可以使用下列的步骤来确保你的类是否是键值观察兼容的。

注册成一个观察者
为了在一个属性改变时被通知,一个观察者对象必须首先在被观者者对象发送addObserver:forKeyPath:options:context消息注册成观察对象。这个方法的options参数指出的信息是改变的通知什么时候被发送的。使用NSKeyValueObservingOptionOld选项指定原始对象的值当作更改字典中的一个实体提供给观察者。指定NSKeyValueObservingNew选项把新值当作更改字典中的一个实体提供给观察者对象。为了同时接收2个值,你可以对option常量使用或运算。

下面的例子阐述了为openingBalance属性注册一个观察者对象
- (void)registerAsObserver 
{
     [account addObserver:inspector forKeyPath:@“openingBalance” options:(NSKeyValueObservingNew | NSKeyValueObservingOld) context:NULL];
}

当你注册一个对象成为观察者时,你可以提供一个context指针。这个指针在 observeValueForKeyPath:ofObject:change:context:调用时传递给观察者。这个指针可以是一个C指针或者是一个对象饮用。这个指针可以用来当作唯一的标识来决定更改是否需要被观察,或者提供一些额外的信息给观察者对象。
注意:KVO  observeValueForKeyPath:ofObject:change:context:方法并不对观察对象,被观察对象或者context保持强引用。你必须在必要时确保你对这些对象保持强引用。

接收更改的通知
当被观察的属性的值发生更改时,观察者接收一个 observeValueForKeyPath:ofObject:change:context:消息。所有的观察者必须实现这个方法。
当观察的通知被触发时, 提供 观察者一个对象和key的路径,一个包含更改细节的字典,一个在观察者注册时提供的上下文指针。

更改字典实体NSKeyValueChangeKindKey提供了关于发生更改的类别的信息。如果观察对象的值发生改变时,NSKeyValueChangeKindKey实体返回NSKeyValueChangeSetting。取决于观察者注册时指定的options,NSKeyValueChangeOldKey和NSKeyValueChangeNewKey实体在更改字典中包含了属性更改前和更改后的值。如果属性是一个对象,值就被直接提供了。如果属性是标量或者C结构体,值是以NSValue对象包装了。

如果被观察的属性是一对多的关系,这个NSKeyValueChangeKindKey实体同样指出对象在关系中是否被插入,删除或者取代 分别 通过NSKeyValueChangeInsertion,NSKeyValueChangeRemoval,NSKeyValueChangeReplacement。

更改词典为NSKeyValueChangeIndexesKey的实体是一个NSIndexSet对象指定关系中发生改变的索引。如果 NSKeyValueChangeOldKey或 NSKeyValueChangeNewKey在注册时被指定,更改字典中是包含相关对象改前改后的值的数组。

下面这个例子展示了inspector的 observeValueForKeyPath:ofObject:change:context:的实现影响旧的和新的openingBalance属性的值
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
    if ([keyPath isEqual:@"openingBalance"]) {
        [openingBalanceInspectorField setObjectValue:
            [change objectForKey:NSKeyValueChangeNewKey]];

} /*

     Be sure to call the superclass's implementation *if it implements it*.
     NSObject does not implement the method.
     */
    [super observeValueForKeyPath:keyPath
                         ofObject:object
                           change:change

} 

删除一个注册对象

被观察对象通过发送 removeObserver:forKeyPath:消息来移除一个观察者。如下所示:
- (void)unregisterForChangeNotification {
    [observedObject removeObserver:inspector forKeyPath:@"openingBalance”];
} 

如果context是一个对象,你必须保持一个对它的强引用直到移除这个观察者。接收 removeObserver:forKeyPath:消息以后,观察者对象再也不会从指定的对象和键路径接收任何 observeValueForKeyPath:ofObject:change:context:消息了。


KVO Compliance
为了让一个指定的属性被认为是一个遵从KVO的,一个类必须确信以下几点:
1. 类的这个属性必须是符合KVC
2. 类为这个属性发出KVO更改通告。
3.    依赖的键被正确的注册了。

有两种机制来保证更改通告被发出了。NSObject提供的自动支持是默认的,为类的所有符合KVC的属性提供自动支持。典型的,如果你支持标准的Cocoa 编码和命名约定,你可以使用自动更改通告,你不用写额外的代码。

手动更改通告提供了额外的控制,什么时候通知被发送,需要额外的编码。通过实现类方法 automaticallyNotifiesObserversForKey:你可以控制你子类的属性的自动通告。

自动更改通告(Automatic Change Notification)
NSObject为自动键值更改通告提供了基本的实现。自动键值更改通告使用key-value compliant accessor 通知观察者更改发生了,以及KVC方法。自动通知同时支持通过返回的代理对象的集合,比如mutableArrayValueForKey。
下面的例子展示了属性name的更改导致的通知:
  // Call the accessor method.
  [account setName:@"Savings"];
  // Use setValue:forKey:.
  [account setValue:@"Savings" forKey:@"name"];
  // Use a key path, where 'account' is a kvc-compliant property of 'document'.
  [document setValue:@"Savings" forKeyPath:@"account.name"];
  // Use mutableArrayValueForKey: to retrieve a relationship proxy object.
  Transaction *newTransaction = <#Create a new transaction for the account#>;
  NSMutableArray *transactions = [account mutableArrayValueForKey:@"transactions"];
  [transactions addObject:newTransaction];
手动更改通告(Manual Change Notification)
手动更改通告提供了更加细颗粒的控制:能控制如何,何时消息被发送给观察者。在帮助减少不必要的触发通知是有用的,或者把一组更改转到一个通知。
一个类实现手动通知的话必须实现NSObject实现的 automaticallyNotifiesObserversForKey:方法。在同一个类中同时使用自动和手动观察通知是可以的。执行手动通知的对象,子类实现的 automaticallyNotifiesObserversForKey: 必须返回NO。子类实现的时候必须调用父类的这个方法来处理不认识的keys。以下的例子允许对属性openingBalance属性进行手动通知,允许父类来决定其他的keys的通知。
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
     BOOL automatic = NO;
     if ([theKey isEqualToString:@"openingBalance"]) {
          automatic = NO;
     }
     else {
          automatic = [super automaticallyNotifiesObserversForKey:theKey];
     }
     return automatic;
}

为了实现手动观察通知,你调用willChangeValueForKey在更改这个值之前,并且调用didChangeValueForKey在更改这个值之后。如下所示:
- (void)setOpeningBalance:(double)theBalance {
    [self willChangeValueForKey:@"openingBalance”];
    _openingBalance = theBalance;
    [self didChangeValueForKey:@"openingBalance”];
}

通过首先检查值是否发生改变,你可以最小化不必要的消息发送。如下:
- (void)setOpeningBalance:(double)theBalance {
     if (theBalance != openingBalance) {
          [self willChangeValueForKey:@"openingBalance”];
         _openingBalance = theBalance;
         [self didChangeValueForKey:@"openingBalance”];       
         }
}

如果一个操作引起多个键发生更改,你必须嵌套进行更改通告:
- (void)setOpeningBalance:(double)theBalance {
    [self willChangeValueForKey:@"openingBalance"];
    [self willChangeValueForKey:@"itemChanged"];
    _openingBalance = theBalance;
    _itemChanged = _itemChanged+1;
    [self didChangeValueForKey:@"itemChanged"];
    [self didChangeValueForKey:@"openingBalance"];

} 

在一个有序的一对多的情况下,你必须指定发生改变的值,同时需要指定发生改变的类别和涉及到的对象的索引。更改的类型是NSKeyValueChange,包括NSKeyValueChangeInsertion,NSKeyValueChangeRemoval或者NSKeyValueChangeReplacement。受影响对象的索引是以NSIndexSet对象传递的。

下面的代码片段阐述了在一对多的关系事物中如何包装一个删除对象。
- (void)removeTransactionsAtIndexes:(NSIndexSet *)indexes {
    [self willChange:NSKeyValueChangeRemoval
        valuesAtIndexes:indexes forKey:@"transactions"];
    // Remove the transaction objects at the specified indexes.
    [self didChange:NSKeyValueChangeRemoval
        valuesAtIndexes:indexes forKey:@"transactions"];

} 


注册依赖的Keys

有许多情况是当属性的值依赖于其他对象的一个或者多个其他的属性。如果一个属性的值发生了改变,依赖的属性的值也必须被改变。你如何确定KVO通知被发送给这些依赖的属性依赖于这些关系集。

一对一的关系
为了自动触发通知给一个一对一的关系,你要么重写 keyPathsForValuesAffectingValueForKey:或者实现一个合适的方法遵从它定义的依赖keys的方式。

比如,fullName同时依赖与first和last names。方法返回full name需要按下面的方式编写:
- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@",firstName, lastName];

} 

一个应用观察fullName属性时,必须在firstName或者lastName属性被更改时被通知,就像fullName被影响了一样。
一种解决方案是重写 keyPathsForValuesAffectingValueForKey:指定fullName属性依赖于属性firstName和lastName。如下展示了这样的一个依赖:
+ ( NSSet  *)keyPathsForValuesAffectingValueForKey:( NSString  *)key {
    
NSSet  *keyPaths = [ super   keyPathsForValuesAffectingValueForKey :key];
    
if  ([key  isEqualToString : @"fullName" ]) {
        NSArray *affectingKeys = 
@[ @"lastName" ,  @"firstName" ] ;
        keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
    }
    
return  keyPaths;
}


你的重写必须调用父类的方法并且返回包含依赖的keys的set。
你可以达到同样的结果实现一个类方法遵从命名规则 keyPathsForValuesAffecting<Key> ,key 就是属性的名字,这里是fullName。使用这种方式重写 keyPathsForValuesAffecting FullName方法:
+ ( NSSet  *)keyPathsForValuesAffectingFullName {
    
return  [ NSSet   setWithObjects : @"lastName" ,  @"firstName" ,  nil ];
}

注意:当你使用category扩展一个已经存在的类,在category中添加一个计算属性时,你不能重写 keyPathsForValuesAffectingValueForKey方法。相反, 您必须遵守每个对象的相应属性的一对多收集和自行更新依赖键响应改变他们的价值观。下面的部分显示了一个策略来处理这种情况。

一对多的关系
keyPathsForValuesAffectingValueForKey方法不 包含 支持 一对多的 键路径。比如,假设你有一个Department对象与employee拥有一对多的关系(employees)。Employee有一个salary属性,你的Department有一个totalSalary的属性依赖于关系中所有employee的salary。你不能用 keyPathsForValuesAffectingTotalSalary,返回employees.salary的key。

为这两种情形有2种可能的解决方法:
1. 你可以使用KVO注册parent(Department)成为每个孩子(Employee)的相关属性的观察者。你必须添加和删除父类为一个孩子对象的观察者来添加和删除关系。在   observeValueForKeyPath:ofObject:change:context:方法中,你更新依赖的值来响应更改,如下面代码片段所展示:

- ( void )observeValueForKeyPath:( NSString  *)keyPath ofObject:( id )object
                        change:(
NSDictionary  *)change context:( void  *)context {
    
if  (context == totalSalaryContext) {
        [
self  updateTotalSalary];
    }
    
else
        
// deal with other observations and/or invoke super...
}

- (
void ) updateTotalSalary  {
    [
self  setTotalSalary:[ self  valueForKeyPath: @"employees.@sum.salary" ]];
}

- (
void )setTotalSalary:(NSNumber *)newTotalSalary {
    
if  (totalSalary != newTotalSalary) {
        [
self  willChangeValueForKey: @"totalSalary" ];
        _totalSalary = newTotalSalary;
        [
self  didChangeValueForKey: @"totalSalary" ];
    }
}

- (NSNumber *)totalSalary {
    
return  _totalSalary;
}


2.如果你使用Core Data,你可以用应用程序的通知中心注册这个parent为它管理对象的context的一个观察者。parent必须响应孩子发送的相关的更改通知,类似于KVO的方式。


KVO实现的细节
自动KVO是通过一个叫做isa-swizzling的技术实现的。
isa指针,就像它名字建议的那样,指像拥有dispatch table的对象的类。这个dipatch table实质上包括类实现的方法的指针。

当一个观察者为一个对象的属性注册时,被观察对象的isa指针被改变了,指向了中间类而不是指向真正的类。结果就是isa指针的值不会影响真正类的实例。

你永远也不应该依赖isa指针来决定类关系。相反,你必须使用类方法来决定对象实例的类。
 
iOS之深入解析KVO的底层原理 一、KVO 简介 ① 概念 KVO 全称 Key Value Observing,是苹果提供的一套事件通知机制,允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。 由于 KVO 的实现机制,所以对属性才会发生作用,一般继承自 NSObject 的对象都默认支持 KVO。 KVO 和 NSNotificationCenter 都是 iOS 中观察者模式的一种实现,区别在于,相对于被观察者和观察者之间的关系,KVO 是一对一的,而 NSNotificationCenter 是一对多的,KVO 对被监 阅读详情

相关推荐

浙政钉(专有钉钉)门户免登(超详细)

钉钉家族 介绍浙政钉门户免登之前,首先搞清楚几个软件的关系,软件分别是:钉钉,专有钉钉,浙政钉 钉钉 是阿里巴巴集团专为中小企业打造的沟通和协同的多端平台。 专有钉钉 原名 政务钉钉,有更开放的设计能力、集成能力、更结构化协同产品、更定制化开发平台。支持专有化部署,数据落本地,更安全、客户可对该产品持牌运营、结构化编排,协助构建本地应用中心、提供移动应用全面安全保障体系。 浙政钉 为规范浙政钉整体架构体系,按照统分结合原则,由省政府办公厅统一设计整体工作界面和系统框架,统筹指导全省统建应用建设,各单

一缕南风的博客 2万+

MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]

MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]: 基础训练题: Q1:摇晃micro:bit编程板,随机出现7个小动物图标中的一个,并且前后相邻两次出现的小动物不重复。 注:七个小动物图标为鸭子、乌龟、蝴蝶、长颈鹿、蛇、兔子、奶牛 Q2:摇晃micro:bit编程板,随机出现1~9之间的任意一个奇数,并且前后相邻两次出现的数字不重复。 超级挑战题: Q3:摇晃micro...

minemi的博客 1万+

zynq-7000学习笔记(八)——USB摄像头图像采集

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:Zed Board USB摄像头:罗技 C270(720P) linux源码:2016_R1 一、配置linux,支持UVC       如果是中星微的ZC3XX系列的芯片,则要进到GSPCA把ZC3XX的驱动选上

luotong86的专栏 1万+

音乐的随机播放

刚刚测试了一下android系统下三个音乐播放器关于随机播放音乐的实现方式:QQ音乐,小米的音乐播放器,以及百度音乐。 把播放模式设定为随机播放,播放存在手机的上的音乐列表。经过测试,大概分析出了3个播放器各自随机播放的实现。 1. 小米的音乐播放器 小米音乐的随机算法:在进入一个列表的时候,一组随机数就已经生成,然后音乐播放的循序就是按随机数进行的。 比如现在有5首歌曲,开始播放的时候生

MakeCodeClear的专栏 4464

电路设计仿真软件:Mentor Graphics_(1).MentorGraphics电路设计仿真软件概述

菜单栏:包含文件、编辑、视图、工具等菜单。工具栏:提供常用的工具按钮,如打开、保存、仿真等。原理图编辑区:用于绘制电路原理图。元件库:包含各种电路元件,支持拖拽操作。属性面板:显示选中元件的属性,可以进行参数设置。仿真控制区:用于设置仿真参数和控制仿真过程。输出窗口:显示仿真结果和日志信息。打开模型编辑器:点击“工具”菜单,选择“模型编辑器”。选择模型类型:在模型编辑器中选择模型类型,如SPICE模型。输入模型参数:根据需要输入模型的参数,如电阻值、电容值等。保存模型。

kkchenjj的博客 1924

使用 syncstart 实现同场景下多个音视频音轨自动化同步

如果需要在视频编辑中同步多个机位的音轨,使得相同的视频能够同时播放,手动操作可能会变得相当复杂。特别是当处理多个视频文件时,例如有10个视频需要互相匹配,实现一对多的同步关系,这就涉及到为每对视频生成匹配的音轨数据。手动完成这样的任务,如生成90套对应的音轨数据,不仅耗时而且容易出错。因此,使用脚本自动化这一过程是一个更为高效和准确的解决方案。通过编写脚本,您可以批量处理多个视频文件,自动同步它们的音轨,大大简化了音视频编辑的工作流程,并确保了同步的准确性。

Mr数据杨 1076

【iOS】KVO

类对象中保存着当前对象的实例方法,在向该对象发送消息的时候,实际上是发送到了派生类对象的方法。不一定触发instance实例对象的setter方法,但是该方法在修改成员变量的值的时候会调用。上述我们看了当注册观察者之后会生成一个中间类,那么当我们移除观察者之后,这里又会指回原本的类。这里要注意一点,当移除观察者之后,isa指针会指向原来的类,但是并不销毁中间类。,翻译为键值观察,这是一种机制,其允许其他对象的指定属性的更改通知给对象。,动态的修改当前实例对象的isa指针,使其指向派生类,并重写了。

2301_79847748的博客 1172

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1681

「iOS」——KVO

本文介绍了 iOS 中 KVO(键值观察)的底层原理和使用方法。KVO 是一种观察者模式实现,通过监听对象属性变化实现自动通知。详细讲解了 KVO 的注册、监听、移除等基本使用流程,深入分析了手动 KVO 的实现方式,包括关闭自动通知和手动触发通知。

2301_80253909的博客 1327

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1259

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 692

ios kvo 要引入_iOS中KVO的使用

KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应。网上广为流传普及的一个例子是利用KVO检测股票价格的变动,例如这里。这个例子作为扫盲入门还是可以的,但是当应用场景比较复杂时,里面的一些细节还是需要改进的,里面有多个地方存在crash的危险。本文旨在逐步递进深入地探讨出一种目前比较健壮稳定的KVO实现方案,弥补网上大部分...

weixin_39708708的博客 180

2023年下半年网络工程师案例分析真题答案解析

R1] ip route-static 0.0.0.0 0.0.0.0 GigabitEthemet2/0/1 (3) track (4) R1 to R2 //配置R1的缺省路由,联动BFD使得R1到2的流量优先走R1->S1->R2链路,当此链路发生故障时,流量切换到R1->R3->R2链路上。当同一VLAN内也需要网络隔离时,我们可采用交换机的(2)功能,若在配置了二层隔离后,部分主机有互通的需求,则可在需求主机的网关上配置(3)功能。不需要,MAC地址是数据链路层封装以太帧的地址标识。

鹿鸣天涯 751

iOS开发之KVO

iOS开发之KVO KVO简介: KVO(Key - Value Observing)键值观察,是一种观察者模式的应用。当观察者将被观察者的某个属性设置为观察的对象时,若被观察的该属性值发生变化时,就会触发观察者对象所实现的KVO接口方法,从而达到通知观察者的目的。KVO的定义也是在NSObject的扩展类(NSKeyValueObserving)中实现的,所以只有继承了NSObject的类才...

黎明的博客 794

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【iOS开发】—— KVO原理

主要用了isa-swizzling,修改了观察者的类信息,并且hooksetter方法,当setter方法调用时发送消息给所有观察者。由上面源码可以看出对观察者、被观察者的引用都是Not Retain, 所以对象释放前一定要移除观察者。

qq_72437394的博客 1104

温度PID控制PLC程序

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

iOS Runtime之 KVO

KVO(Key-Value Observing)是iOS中基于键路径的属性观察机制,通过运行时动态生成子类并重写setter方法实现属性变化的自动通知。使用步骤包括注册观察者、实现回调方法和及时移除观察者。开发中需注意注册/移除配对、防止重复操作、确保属性KVO兼容性、正确使用context参数以及线程安全等问题。Swift中需用@objc dynamic修饰属性才能支持KVO。KVO适用于数据驱动UI更新等场景,但要注意其潜在风险如野指针崩溃等。

RollingPin的博客 874

ios kvo 要引入_iOS KVO 实现原理 和 自己实现KVO

一:前言KVO 是我们经常使用的键值观察者模式的一种实现 。大概功能是 比如有两个对象 A 和B B 观察了A的某个属性E ,当E发生变化的时候 B中收到回调 回调中 有新的 或者 旧的值 。 apple 原生给我们提供了这样的方式 。但是 其实系统提供的 KVO 是有很多不方便的地方例如 系统KVO 的问题 和系统KVO 问题二 补充一点 重复添加 或者 重复移除KVO 都会直接...

weixin_39856803的博客 244

ios kvo 要引入_iOS:KVO

本文仅是记录自己在学习的过程中的理解:如有错误,还望各位大佬指正,THX.KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相...

weixin_39562197的博客 218

【iOS】KVO详细总结

KVO详细总结

cheng_lin0201的博客 1090

iOS—KVO用法及本质

文章目录KVOKVO 的使用KVO本质总结一些问题 KVO KVO全称KeyValueObserving,键值监听,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接受到事件。 KVO 的使用 三个方法 注册观察者 addObserver:(nonnull NSObject *) forKeyPath:(nonnull NSString *) options:(NSKeyValueObservingOptions) context:(nullable void *) ob

qq_45836906的博客 516

ios kvo 要引入_iOS kvo 结合 FBKVOController 的使用

iOS kvo 结合 FBKVOController 的使用一:FBKVOControlloer是FaceBook开源的一个 在 iOS,maxOS上使用 kvo的 开源库;提供了block和@selector(SEL) 的回调操作,很方便实用;二:示例:fbKVO = [FBKVOController controllerWithObserver:self];[fbKVO observe:per...

weixin_39777875的博客 142

【iOS】KVO相关总结

本篇文章了解了 KVO 机制的进阶使用、使用规范和本质原理。 KVO的全称是Key-Value Observing,即键值监听或键值观察,用于监听某个对象属性值的改变KVO是苹果提供的一套事件通知机制(其声明全部在Foundation框架中的里),允许一个对象监听另一个对象指定属性值的改变。当被观察对象属性值发生改变时,会触发KVO的监听方法来通知观察者因为KVO接口声明是,即给NSObject添加的分类Category,所以大多数对象都可以键值观察或键值监听。

XY_Mckevince的博客 1208

ios kvo 要引入_iOS-KVO 实现原理

一、概述KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察者就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO其实也是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。二、KVO 的具体实现具体实现代码如下:#import "...

weixin_39994438的博客 181

iOS —— 初识KVO

KVO传值也很简单,可以理解为我们对第二个viewController的某一个属性做一个监听,当我们跳转到第一个viewController的时候就可以监听到值的改变。KVO是一种开发模式,它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架下提供的一种开发机制,使用KVO,可以方便地对指定对象的某个属性进行观察,当属性发生变化时,进行通知,告诉开发者属性旧值和新值对应的内容。在textFiled中写入文本,然后通过按钮进入到下一个界面。

qq_72437394的博客 1806
上一篇: iOS Runtime
下一篇: iOS并发编程(上)-- NSOperation queue
MakeCodeClear
博客等级 码龄14年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值