我有一个可变数组,我在界面中公开过。我还公开了数组访问器来修改数组。如果在阵列中发生任何修改,我将不得不使用KVO重置并重新计算一些数据。为了支持KVO,我使用array accessors,如下所示:
数组属性+数组访问器+数组访问器的包装器:
Mutable Array:
@property (nonatomic, strong) NSMutableArray *portfolioItemArray;
Array Accessors:
-(void)insertObject:(Service*)object inPortfolioItemArrayAtIndex:(NSUInteger)index;
-(void)removeObjectFromPortfolioItemArrayAtIndex:(NSUInteger)index;
-(void)insertPortfolioItemArray:(NSArray *)array atIndexes:(NSIndexSet *)indexes;
-(void)removePortfolioItemArrayAtIndexes:(NSIndexSet *)indexes;
Wrappers for Array Accessors:
-(void)addObjectToPortfolioItemArray:(Service*)inObject;
-(void)removeObjectFromPortfolioItemArray:(Service*)inObject;
-(void)addObjectsToPortfolioItemArray:(NSArray*)inPortfolioItemsArray;
-(void)removeObjectsFromPortfolioItemArray:(NSArray*)inPortfolioItemsArray;
一切正常,只有数组访问器触发KVO,或者其他程序员也调用它的包装器。
问题: 其他一些开发人员可能会选择执行:
[portfolioObject.portfolioItemArray addObject:xxxxx];
而不是:
[portofolioObject addObjectToPortfolioItemArray:xxxxx];
这会使整个设置失灵并且不会触发KVO。是否有更好的处理机制?如何避免程序员在不使用数组访问器的情况下选择直接插入可变数组?
编辑:忘记提及,我必须公开数组,因为它可以从外部设置(需求的一部分)。我通过覆盖-portfolioItemArray的setter来更新我的KVO观察。
答案 0 :(得分:2)
不要暴露可变数组。公开一个不可变的数组和一些方法来改变投资组合。