面试题答案
一键面试1. 当指定的key在对象中不存在时的情况
在使用KVC进行 setValue:forKey:
操作时,如果指定的 key
在对象中不存在,默认情况下会触发 NSUnknownKeyException
异常。
2. KVC的异常处理机制
- 查找路径:KVC查找
key
遵循一定的路径。首先在对象本身查找是否有对应的属性(包括实例变量、访问器方法)。如果没找到,会沿着继承体系继续查找。若最终都未找到,则触发异常。 - 集合操作:对于集合类型(如
NSArray
、NSSet
),如果对集合中的元素进行setValue:forKey:
操作且key
不存在,同样会对每个元素触发异常。
3. 自定义异常处理行为
- 方法1:重写
setValue:forUndefinedKey:
可以在类中重写setValue:forUndefinedKey:
方法来处理不存在的key
。在这个方法中可以实现自定义的逻辑,比如记录日志、进行默认值设置等。
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@end
@implementation MyObject
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
NSLog(@"Setting value for undefined key %@ with value %@", key, value);
// 这里可以进行自定义处理,比如设置默认值
}
@end
- 方法2:重写
accessInstanceVariablesDirectly
和valueForUndefinedKey:
重写accessInstanceVariablesDirectly
方法返回NO
,阻止KVC直接访问实例变量。然后重写valueForUndefinedKey:
方法处理读取不存在key
的情况。
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@end
@implementation MyObject
+ (BOOL)accessInstanceVariablesDirectly {
return NO;
}
- (id)valueForUndefinedKey:(NSString *)key {
NSLog(@"Getting value for undefined key %@", key);
// 这里可以返回自定义的默认值
return @"Default Value";
}
@end
在使用这些自定义处理方式时,需要注意避免无限循环等问题,确保处理逻辑的正确性和稳定性。