我今天有一个快速的。假设我有一个名为BSDHistoryManager
. 它是一个简单的状态历史记录器,就像在 Web 浏览器中一样(又名History
对象 [ window.history
])。以下是 .h/m 文件的简化示例:
BSDHistoryManager.h
@interface BSDHistoryManager : NSObject
@property (nonatomic, copy) NSArray *states;
@end
BSDHistoryManager.m
@implementation BSDHistoryManager {
NSMutableArray *_states;
}
- (NSArray *)states
{
return _states.copy;
}
- (void)setStates:(NSArray *)states
{
if ( [states isEqualToArray:_states] )
return;
_states = states.mutableCopy;
}
@end
正如你所看到的,我在内部有一个标准的可变集合,当使用 getter 访问它时会复制它,这样内部就不会被弄乱。此时,我想添加一些公共访问器方法,例如-addState:
,-removeState:
等。例如,我喜欢像这样制作自己的访问器:
- (void)addState:(BSDState *)state;
- (void)insertState:(BSDState *)state atIndex:(NSUInteger)index;
但是,我也想定义 KVC 方法。你知道,看起来像这样的那些:
- (void)addStatesObject:(id)object;
- (void)insertObject:(id)object inStatesAtIndex:(NSUInteger)index;
现在我两者都有了,这很酷,但我希望我的类界面美观整洁,因此更易于阅读和理解。我的问题是:在实现KVC 访问器模式时,我是否需要声明这些方法,还是仅通过实现这些方法来“免费”获得 KVC 合规性?或者更好的问题是:如果我制作自己的自定义命名方法,我什至需要实现 KVC 方法吗?
希望这是有道理的,但如果没有,我会尝试更好地解释它。谢谢阅读!