iOS键值编码(KVC)与键值监听(KVO)

KVC

除了setter和getter方法设置和修改对象的属性,以及简化的点语法。oc还提供了一种更为灵活的操作方式,这种方式允许以字符串形式间接操作对象的属性,全称是key value coding(简称KVC),即键值编码。

最基本的两个操作:

setValue:属性值 forKey:属性名            为指定属性赋值

valueForKey:属性名                               获取指定属性的值


#import <Foundation/Foundation.h>

@interface MineKvc : NSObject

@property (nonatomic,copy) NSString * name ;
@property (nonatomic,copy) NSString * pass ;
@property (nonatomic,copy) NSDate * birth  ;
@end

#import <Foundation/Foundation.h>
#import "MineKvc.h"

int main(int argc, const char * argv[]) {
 
    MineKvc * myKvc = [[MineKvc alloc]init];
    [myKvc setValue:@"Pudege" forKey:@"name"];
    [myKvc setValue:@"2015" forKey:@"pass"];
    [myKvc setValue:[[NSDate alloc]init] forKey:@"birth"];
    
    NSLog(@"%@--%@--%@",[myKvc valueForKey:@"name"],[myKvc valueForKey:@"pass"],[myKvc valueForKey:@"birth"]);
    
    
}

setValue:forKey:的代码底层机制如下:

1.优先调用属性的setName:

2.如果没有setter方法,KVC会搜索_name的成员变量,无论在哪定义,KVC对_name成员变量赋值。

3.没有1和2,KVC会搜素name变量,无论在哪定义,KVC对name成员变量赋值。

4.若以上3条都没有找到,执行该对象的setValue:forUndefinedKey;

valueForKey 同上。

代码实现如下

#import <Foundation/Foundation.h>

@interface MineKvc : NSObject
{
    @package
    NSString * kvc ;
    NSString * _kvc ;
}
@property (nonatomic,copy) NSString * name ;
@property (nonatomic,copy) NSString * pass ;
@property (nonatomic,copy) NSDate * birth  ;

@end

@implementation MineKvc
{
    int imkvc;
}

#import <Foundation/Foundation.h>
#import "MineKvc.h"

int main(int argc, const char * argv[]) {
 
    MineKvc * myKvc = [[MineKvc alloc]init];
    [myKvc setValue:@"Pudege" forKey:@"name"];
    [myKvc setValue:@"2015" forKey:@"pass"];
    [myKvc setValue:[[NSDate alloc]init] forKey:@"birth"];
    
    NSLog(@"%@--%@--%@",[myKvc valueForKey:@"name"],[myKvc valueForKey:@"pass"],[myKvc valueForKey:@"birth"]);
    
    
    
    [myKvc setValue:@"KVC" forKey:@"kvc"];
    NSLog(@"_kvc= %@",myKvc->_kvc);
    NSLog(@"kvc = %@",myKvc->kvc);
    
    
    [myKvc setValue:@"implementation" forKey:@"imkvc"];
    NSLog(@"%@",[myKvc valueForKey:@"imkvc"]);
    
}


2015-07-28 11:46:28.679 KVC[1879:63384] Pudege--2015--2015-07-28 03:46:28 +0000

2015-07-28 11:46:28.680 KVC[1879:63384] _kvc= KVC

2015-07-28 11:46:28.680 KVC[1879:63384] kvc = (null)

2015-07-28 11:46:28.680 KVC[1879:63384] 0

除了以上知识点,还要注意重写undefinedKey的两个方法,防止编译器抛出异常。

若用KVC给简单数据类型如int赋值nil,需要重写setNilValueForKey:。


Key路径

对象的“复合属性”,即KVC的的Key路径。一个对象包含一个Pudge类型的pudge属性,而Pudge类型又包含name属性,那么KVC通过pudge.name这种Key路径来赋值。

setValue:forKeyPath;

valueForKeyPath;


KVO

kvo机制NSKeyValueObserving协议提供支持,NSObject遵循了该协议。常有方法:

 addObserver:forKeyPath:options:context 注册一个监听器用于监听指定的key路径

 removeObserver:forKeyPath:             为key路径删除指定监听器

 removeObserver:forKeyPath              同上,添加上下文context



重写该方法,当被监听的数据模型发生改变时候,就会回调监听器的该方法。


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context



MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值