探索KVC和KVO的本质

15、探索Cocoa绑定、KVC和KVO:简化应用开发的利器 本文深入探讨了Cocoa绑定、键值编码(KVC)和键值观察(KVO)在桌面与移动应用开发中的核心作用,结合Core Data实现高效的数据管理与界面同步。通过实际案例解析NSTableView、NSArrayController、NSFormatter等组件如何利用这些技术简化开发流程,提升代码复用性与用户体验。文章还总结了各项技术的优势、注意事项及未来发展趋势,为开发者提供了一套构建跨平台应用的高效解决方案。 阅读详情
  • 原文链接: 探索KVC和KVO的本质
  • 这篇文章主要介绍KVO和KVC, 机器底层是如何实现的
  • KVO的全称是Key-Value Observing,俗称键值监听,可以用于监听某个对象属性值的改变
  • KVO是使用获取其他对象的特定属性变化的通知机制,控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的
  • 对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器并更新用户界面值
  • KVC和KVO都是基于OC的动态特性和Runtime机制的

KVO

添加监听

如下所示, 我们为person对象添加一个监听

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.person = [[Person alloc]init];
    self.person.age = 10;
    
    // 给person添加KVO监听
    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    [self.person addObserver:self forKeyPath:@"age" options:options context:nil];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.person.age = 10;
}


// 当监听的对象发生改变时就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    
}

上面添加监听的方法

addObserver:forKeyPath:options:context:
监听方法各个参数的作用分别是什么

[object addObserver: observer forKeyPath: @"frame" options: 0 context: nil];
/**
object: 被观察者
observer: 观察者
KeyPath: 被观察者索贝观察的属性
options: 有四个值
    1、NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法
    2、NSKeyValueObservingOptionOld 把更改之后的值提供给处理方法
    3、NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注  册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
    4、NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。
context:上下文,可以带一些参数,任何类型都可以
*/

当被监听的对象的属性发生改变时就会调用下面的方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    
}

/*
 1. keyPath: 被监听的属性
 2. object: 被监听的对象
 3. change 属性变化字典(新/旧)
 4. 上下文,与监听的时候传递的一致
 */

KVO的本质

这里我们创建两个pweson对象, 但是只对person1实行监听

    self.person1 = [[Person alloc]init];
    self.person2 = [[Person alloc]init];
    self.person1.age = 10;
    self.person2.age = 10;
    
    // 给person添加KVO监听
    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    [self.person1 addObserver:self forKeyPath:@"age" options:options context:nil];

下面我们可以在touchesBegan方法中分别添加断点打印两个对象的isa, 如下

image

  • 从上面可以看出,未添加监听的pweson2对象的isa依然是Person, 但是添加KVO监听的person1的isa变成了NSKVONotifying_Person
  • NSKVONotifying_Person这个类是由Runtime在运行状态下动态创建的一个类, 是Person的一个子类
  • 当我们对age属性进行赋值操作的时候, 其实调用的是Person类的setAge方法
    • person1通过isa找到其对应的类对象Person类, 并调用Person类的setAge方法
    • person2通过isa找到其对应的类对象NSKVONotifying_Person类, 并调用NSKVONotifying_Person类的setAge方法
    • 两个类的setAge方法的实现是不一样的, 后面会详解
  • Person和NSKVONotifying_Person对应的类对象如下所示

image

使用了KVO监听的对象动态生成的NSKVONotifying_Person类

image

实际上NSKVONotifying_Person类中的setAge:方法内部是调用了Foundation的_NSSetIntValueAndNotify方法, 有兴趣的可以反编译一下Foundation.framwork的源码, 查看其伪代码, 大致的可以推出内部方法的实现, 代码大致如下

- (void)setAge:(int)age
{
    _NSSetIntValueAndNotify();
}

// 伪代码
void _NSSetIntValueAndNotify()
{
    [self willChangeValueForKey:@"age"];
    [super setAge:age];
    [self didChangeValueForKey:@"age"];
}

- (void)didChangeValueForKey:(NSString *)key
{
    // 通知监听器,某某属性值发生了改变
    [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
}
  • 从上面的代码可以看出_NSSetIntValueAndNotify其实重写了willChangeValueForKey和didChangeValueForKey两个方法
  • 而且监听属性值变化的是在didChangeValueForKey方法中实现的
  • 下面我们就来验证一下上述代码

首先我们在Person类内部重写willChangeValueForKey和didChangeValueForKey两个方法, 在运行的过程中分别加断点进行调试, 如下

- (void)setAge:(int)age{
    _age = age;
    
    NSLog(@"setAge:");
}

- (void)willChangeValueForKey:(NSString *)key{
    [super willChangeValueForKey:key];
    
    NSLog(@"willChangeValueForKey");
}

- (void)didChangeValueForKey:(NSString *)key{
    NSLog(@"didChangeValueForKey - begin");
    
    [super didChangeValueForKey:key];
    
    NSLog(@"didChangeValueForKey - end");
}

然后在如下代码中加断点

// 当监听对象的属性值发生改变时,就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"监听到%@的%@属性值改变了 - %@ - %@", object, keyPath, change, context);
}

在输出结果中可以看到代码的执行顺序, 从下面的代码可以看出监听属性的改变其实是在didChangeValueForKey方法中实现的

setAge:

didChangeValueForKey - begin

监听到<MJPerson: 0x60000389b680>的age属性值改变了 

didChangeValueForKey - end

KVC

  • KVC全称是Key Value Coding(键值编码),是一个基于NSKeyValueCoding非正式协议实现的机制,它可以直接通过key值对对象的属性进行存取操作,而不需通过调用明确的存取方法
  • 这样就可以在运行时动态在访问和修改对象的属性,而不是在编译时确定
  • KVC提供了一种间接访问属性方法或成员变量的机制,可以通过字符串来访问对象的的属性方法或成员变量
  • 相关常见的API有
// 通用的访问方法
- (id)valueForKey:(NSString *)key; 
- (void)setValue:(id)value forKey:(NSString *)key;
// 衍生的keyPath方法, 用来进行深层访问(key使用点语法),也可单层访问:
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKeyPath:(NSString *)keyPath;

通用访问方法使用示例

// 使用示例
Person *person = [[Person alloc] init];
 
 // 赋值
[person setValue:@"titan" forKey:@"name"];

// 取值
NSLog(@"-------name = %@",person.name);
NSLog(@"-------name = %@",[person valueForKey:@"name"]);

keyPath方法使用示例

//注意,这里要想使用keypath对adress的属性进行赋值,必须先给myself赋一个Address对象
Address *myAddress = [[Address alloc] init];
   
[myself setValue:myAddress forKey:@"address"];
   
//KeyPath为多级访问
[myself setValue:@"rizhao" forKeyPath:@"address.city"];
 
//取值
NSLog(@"-------city = %@",myself.address.city);
NSLog(@"-------city = %@",[myself valueForKeyPath:@"address.city"]);

底层原理

setValue:forKey:

image

0. 我们先创建一个Person类, 并在Person.h文件中声明一个age属性, 如下

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (assign, nonatomic) int age;

@end

下面我们在ViewController.m里面调用一下看看

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *person = [[Person alloc]init];
    // 这种方式调用的是setAge方法
    person.age = 10;
    
    // 内部其实是调用的setAge方法
    [person setValue:@20 forKey:@"age"];
    NSLog(@"%d", person.age);
    // 打印结果20
}
  • 如果在Person.h文件中没有声明age属性,也就是在Person.m文件中没有默认生成的setAge和getAge方法
  • 那么调用setValue方法对age存值的时候就会导致程序崩溃, 并会报出setValue:forUndefinedKey:]的错误
  • 如同上图中所示, setValue:forKey:的原理实际上就是先按照setAge:和_setAge:顺序查找方法, 如果找到了对应方法中的一个, 则代码可以执行成功, 下面我们就一个个验证一下吧

1. 验证setKey和_setKey方法, 代码如下

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject

// .h文件中不添加age属性
//@property (assign, nonatomic) int age;

@end

在.m文件中分别添加一下两个方法, 侧其中一个方法的时候, 可以先注释掉另外一个方法

#import "Person.h"

@implementation Person


- (void)setAge:(int)age {

    NSLog(@"setAge--");
}

- (void)_setAge:(int)age {
    
    NSLog(@"_setAge--");
}
@end

然后在ViewController.m调用setValue方法的时候, 可以看到打印对应的输出, 当上述两个方法同事存在的时候, 则会默认执行setAge方法

[person setValue:@20 forKey:@"age"];

2. 如果没有setKey:和_setKey:两个方法, 则会继续查找Person.m文件中是否有accessInstanceVariablesDirectly方法, 如果没有程序会奔溃

#import "Person.h"

@implementation Person

+ (BOOL)accessInstanceVariablesDirectly {
    // 默认返回值是YES
    return YES;
}
@end
  • accessInstanceVariablesDirectly方法默认是返回YES的, 如果return NO, 则程序同样会崩溃, 并抛出NSUnknownKeyException异常
  • 在return YES的情况下, 会按照顺序查找_key、_isKey、key、isKey等成员变量, 如果找不到依然会抛出NSUnknownKeyException异常
  • 下面在Person.h文件中, 分别声明四个变量
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public
    int age;
    int isAge;
    int _age;
    int _isAge;
}
@end

在ViewController.m中添加如下代码, 执行结果如下所示

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *person = [[Person alloc]init];

    [person setValue:@20 forKey:@"age"];
    NSLog(@"-----------");
}

image

  • 当我们在Person.h中声明age、isAge、_age、_isAge四个变量的时候, 上述代码会默认赋值给_age变量
  • 当我们不声明_age属性时, 则会默认赋值给_isAge属性, 以此类推依次是age和isAge变量, 有兴趣的可以亲自测试一番
valueForKey

image

valueForKey通过key进行取值的时候, 取值流程和setValue类似, 途中也比较清晰, 这里就不在赘述了


深入探索Objective-C中的KVC和KVO技术 本文还有配套的精品资源,点击获取 简介:KVC(键值编码)和KVO(键值观察)是Objective-C用于iOS和Mac OS X开发的两种关键特性,用于对象属性的动态访问和观察。本项目演示了KVC和KVO的工作原理及其应用场景,涵盖数据绑定、归档解档、动态属性访问、对象属性变化监听和通知处理等。通过这个示例,开发者可以学习如何在实践中使用KVC和KVO,并了解它们的正确用... 阅读详情

相关推荐

KVC、kVO原理详解

KVC、kVO原理详解

iOS底层原理——KVO和KVC

一、KVO 1、概述 KVO的全称是KeyValueObserving,俗称“键值监听",可以用于监听某个对象属性值的改变; KVO是苹果提供的在套事件通知机制。KVO和NSNotificationCenter都是iOS中观察者模式的一种实现,区别是:NSNotificationCenter可以是一对多的关系,而KVO是一对一的; 2、KVO的使用 使用KVO分为三个步骤: 注册KVO监听 通过[addObserver:forKeyPath:options:context:]方法注册KVO,这样可以接收

iOS0214227的博客 2397

如何使用ArcGIS Pro制作带基底三维地图

点击运行生成范围线,因为之前对高程进行了夸大,导致生成的范围线和地形边缘不重合,我们打开范围线的图层属性,选择高程选项卡,要素位于选择地面上,如下图所示。目前制作的三维地图下面是空的一片,现在添加一个基底,在工具箱内点击“3D Analyst工具\栅格\转换\栅格范围”,调用栅格范围工具,如下图所示。打开ArcGIS Pro,新建一个局部场景,在高程表面下,地面上点击右键,选择添加高程源图层,将需要制作三维地图的DEM数据加载进来,如下图所示。在要素图层菜单内,类型选择绝对高度,如下图所示。

3978

iOS KVC和KVO详解

KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。 在实现了访问器方法的类中,使用点语法和KVC访问对象其实...

weixin_34240520的博客 294

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 190

iOS中KVO的本质

提起KVO,相信很多同学都用过。我们可以用KVO监听对象属性值的改变,当属性值发生改变的时候,我们会在监听方法中得到被监听值的改变情况。 我们简单看一下KVO的使用: #import "ViewController.h" #import "Persion.h" @interface ViewController () @property (strong, nonatomic) Persion *...

IOSSHAN的博客 704

qcc304x笔记之手机端显示电量(九)

默认的sdk有些安卓手机不支持电量显示,所以需要加电量显示的补丁 流程分析 1. 首先新建一个task,并将task注册给电池模块 appBatteryRegister(batteryRegistrationForm) 实现handler处理函数,当battery模块电池电量更新后,会将电池百分比值发送到本模块,然后我们就可以在handler中将实时电量同步到手机端了。 hfpAtCmdInit atCmdTask.task.handler = appAtCmdHandleM...

在云巅的博客 2199

【iOS】—— KVC与KVO

KVC的全称是,俗称“键值编码”,可以通过一个key来访问某个属性;KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量;它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。KVO的全称是,俗称“键值监听",可以用于监听某个对象属性值的改变;KVO是苹果提供的在套事件通知机制。KVO和都是iOS中观察者模式的一种实现,区别。...

m0_55124878的博客 1986

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式如何计算IC电源管脚电感操作指导

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式可以计算电容到IC电源管脚的电感,用于评估电容位置对于IC电源管脚的效果,如何分析,以下图为例进行说明。Capacitors:选择层面,这里选择top layer(IC在top层),下方可以选择电容的size,这里选择All Size。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。模式如何计算IC电源管脚电感操作指导。

weixin_54787054的博客 408

基于R语言的PLS算法实现解读

我们使用"pls"包来执行PLS回归,并提供了相应的源代码。在本文中,我们将详细解读基于R语言的PLS算法的实现过程,并提供相应的源代码。PLS算法的实现可以借助R语言中的"pls"包。该包提供了丰富的函数和工具,用于执行PLS回归、PLS-DA(PLS-Discriminant Analysis)和其他相关任务。除了执行PLS回归,"pls"包还提供了其他功能,例如PLS-DA(用于分类问题)和PLS变量选择等。上述代码将基于输入的X值,使用训练好的PLS模型进行预测,并返回预测结果。

TechWhizKid的博客 1044

ios 通过kvc修改属性会触发kvo_iOS中的KVO和KVC详解(附面试题) - 底层原理总结

开胃面试题1.开发中用过KVO吗?2.开发中用过KVC吗?3.一个对象的KVO是怎么实现的(KVO的本质是什么)?4.可以手动触发KVO吗?怎么触发?5.KVC跟KVO有关系吗?通过KVC修改属性会触发KVO吗?6.KVC的赋值和取值过程是怎样的?原理是什么?看这篇文章之前可以先回答一下这几个面试题,然后带着问题耐心看完这篇文章,再来回答一下看看一、 KVO的基本使用KVO的全称是Key Valu...

weixin_31599065的博客 2259

全新RT-DETR 有效涨点改进目录 | 包含各种卷积、主干改进、各种注意力机制、Neck特征融合改进、损失函数、AIFI创新改进、独家创新、小目标检测、特殊场景检测等最全大论文及小论文必备创新改进点

《全新最全RT-DETR涨点改进专栏》提供500+种创新改进方案,涵盖卷积、注意力机制、主干网络等模块优化,适用于PCB检测、工业缺陷检测等场景。专栏包含顶会论文改进点、数据集增强方法、热力图可视化等实用功能,帮助科研人员快速提升模型性能。提供完整环境配置指南(Python3.10+Pytorch2.5.1)和训练教程,支持不同版本RT-DETR模型。定期更新涨点策略,配套QQ答疑群免费指导,适合从入门到发论文全流程需求,特别推荐给目标检测领域的研究生和工程师。

Ai缝合怪、助力小伙伴高效发论文 3398

iOS之KVC和KVO底层探索

NSObject运行打印:根据KVC 1.步骤,按照顺序查找。由于我们重写了set方法,所以没有给_name赋值。所以打印(null).查看打印:根据KVC 2.步骤理论,会优先给_< key >赋值。所以只打印了 _name = NY根据KVC 3.步骤理论运行,查看打印: 发现控制打印报错。没有找到对应的key值。KVC取值步骤:(1-0)在实例中搜索找到的名称为get< key >,< key >,按此顺序是< key >或_< key >的第一个访问器方法。

yes16ws的专栏 577

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4703

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

iOS KVC本质探索

#####上篇文章讲完了KVO这篇来看看KVC,KVC在开发中的使用也算是挺多的,下面从几个方面来看看KVC #####KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性 常见的API用法 -(void)setValue:(id)value forKeyPath:(NSString *)keyPath; -(void)setValue:(id)...

muziyuting的博客 286

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[iOS]-KVO+KVC

iOS-KVO、KVC原理总结

m0_52192682的博客 555

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

探索KVO的本质是什么?

概述 KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。 KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO是一对一的,而不一对多的。KVO对被监听对象无侵入性,不需要修改其内部代码即可实现监听。 KVO可以监听单个属性的变化,也可以监听集合

Lucky_Deng的博客 507

IOS KVO底层实现原理 (一)

IOS KVO底层实现原理 (一)一,KVO简述二,KVO探索三,KVO底层原理四,KVO底层实现代码 一,KVO简述 KVO的全称 Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变。 带着问题探索: iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO KVO 底层实现是什么? 修改成员变量的值会出发 KVO 吗? KV...

kyl282889543的博客 6627

「OC」探索 KVC 的基础与应用

在我们前面总结了五大传值方法,其中在KVO之中,我们是用的方法实现对对象的属性进行监听的,其中我们想要对属性监听需要我们用到一个KeyPath的参数,去找到监听对象之中与KeyPath名字相同的对应属性。KVC和KVO有些相似,KVC需要使用键值对去直接访问对应的属性KVC(Key-value coding)键值编码,指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值而不需要调用明确的存取方法。我们可以不使用的方法间接访问对象当中的属性。

aa2002aa的博客 946

【iOS】KVC与KVO

KVC是键值编码,在对象创建完成之后可以动态的给对象属性赋值。KVO是键值观察,提供监听机制,当指定对象的属性被修改之后,则对象会收到通知。实例对象isa的指向在注册KVO观察者之后,由原有类更改为指向中间类中间类重写了观察属性的setter方法classdealloc_isKVOA方法dealloc方法中,移除KVO观察者之后,实例对象isa指向由中间类更改为原有类中间类从创建后,就一直存在内存中,不会被销毁注册观察者&响应验证是否存在sette方法保存信息。

2501_91546205的博客 639

探索iOS中的KVC

这篇文章主要是介绍KVC的用法。KVC是一种间接访问对象属性的方法。通常,我们通过属性的getter和setter方法来访问或修改对象的属性。但使用KVC,我们可以通过字符串键来访问这些属性,这使得代码更加灵活和动态。

我叫柱子哥 1393

探索KVO的本质(二)

通过探索kvo的本质(一)我们已经了解到很多关于kvo的基础知识,接下来我们看下面的代码: 我们知道:通过[** class]和object_getClass(**) 都能获取实例对象的类对象,而从上面的运行结果,我们很容易知道,通过runtime的object_getClass(**)获取的就是它的真实的类对象,而[** class]获取的是它的什么? 还记得上一个博客的图吗? 这里直接说结论,是因为[self.person1 class],class方法由于看不到源码,但是我们可以猜.

Lucky_Deng的博客 254

【iOS】KVO

KVO的全称,俗称“键值监听”,可以用于监听某个对象属性值的改变。KVO是一种机制,它允许将其他对象的指定属性的更改通知给对象。理解KVO之前,必须先理解KVC(即KVO是基于KVC基础之上)KVC是键值编码,在对象创建完成后,可以动态的给对象属性赋值,而KVO是键值观察,提供了一种监听机制,当指定的对象的属性被修改后,则对象会收到通知,所以可以看出KVO是基于KVC的基础上对属性动态变化的监听我们知道也是一种监听方式,那么KVO与有什么区别呢?

weixin_72437555的博客 1472

iOSKeyPointExploration KVO/KVC:手动实现与高级用法全攻略

iOSKeyPointExploration是一个专注于iOS核心技术探索的开源项目,涵盖GCD、内存管理、Block、核心动画、KVC、KVO等关键知识点。本文将带你深入了解KVO与KVC的手动实现方法和高级用法,帮助你掌握这两个iOS开发中不可或缺的技术。 ## 一、KVC:键值编码的核心原理与实践 ### 1.1 KVC基本概念与使用方法 键值编码(Key-Value Coding,K

gitblog_00823的博客 211
上一篇: Flutter之可滑动Widget
下一篇: 浅谈OC中Block的本质
CodeTitan
博客等级 码龄9年 51粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值