Lang:简体中文

kvo和kvc面试题

日期:2025-09-08 / 来源:面试宝典

掌握kvo和kvc面试要点

在ios开发的面试中,kvo(key-value observing)和kvc(key-value coding)是经常被问到的知识点。下面就为大家详细介绍一些常见的面试题。

什么是kvo和kvc

首先,kvo是一种机制,它允许对象监听另一个对象特定属性的变化。当被监听的属性值发生改变时,监听对象会收到通知。例如,在一个音乐播放应用中,我们可以使用kvo来监听音乐播放进度的变化,当进度改变时更新ui显示。

而kvc是一种使用字符串间接访问对象属性的机制。通过kvc,我们可以不使用传统的点语法或者getter、setter方法来访问和修改对象的属性。比如有一个person类,有name和age属性,我们可以使用kvc这样访问:

objc

person *person = [[person alloc] init];

[person setvalue:@"john" forkey:@"name"];

nsstring *name = [person valueforkey:@"name"];

kvo的实现原理

kvo的实现基于objective-c的运行时机制。当一个对象被注册为观察者时,系统会动态创建一个该对象类的子类,并重写被观察属性的setter方法。在重写的setter方法中,会在属性值改变前后发送通知给观察者。

例如,有一个student类有score属性,当我们对这个属性进行kvo监听时,系统会创建一个nskvonotifying_student类,并重写score的setter方法。

kvc的使用场景

kvc的使用场景非常广泛。一是在数据解析时,当服务器返回的json数据结构复杂,使用kvc可以方便地提取数据。比如服务器返回的json中有一个嵌套的字典,我们可以通过kvc直接获取深层的数据。

二是在批量操作属性时,kvc可以一次性设置多个属性的值。例如:

objc

nsdictionary *dict = @{@"name": @"alice", @"age": @20};

[person setvaluesforkeyswithdictionary:dict];

使用kvo和kvc的注意事项

使用kvo时,需要注意在对象销毁时移除观察者,否则会导致内存泄漏。例如,在viewcontroller销毁时,要调用removeobserver方法。

使用kvc时,如果指定的键不存在,会调用setvalue:forundefinedkey:和valueforundefinedkey:方法,我们可以重写这两个方法来处理这种情况。

如何手动触发kvo

在某些情况下,我们可能需要手动触发kvo通知。可以通过重写automaticallynotifiesobserversforkey:方法返回no,然后在属性值改变前后手动调用willchangevalueforkey:和didchangevalueforkey:方法。

例如:

objc

+ (bool)automaticallynotifiesobserversforkey:(nsstring *)key {

if ([key isequaltostring:@"score"]) {

return no;

}

return [super automaticallynotifiesobserversforkey:key];

}

- (void)setscore:(int)score {

[self willchangevalueforkey:@"score"];

_score = score;

[self didchangevalueforkey:@"score"];

}

以上就是关于kvo和kvc常见的面试题及详细解答,希望能帮助大家在面试中更好地应对相关问题。

以下为推荐内容

微信二维码