根据API,我必须覆盖这些方法:
setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator
您能举例说明如何覆盖它们吗?
答案 0 :(得分:5)
这实际上比仅仅子类化NSMutableDictionary更复杂。 NSMutableDictionary(以及NSMutableArray)也是不透明的类。也就是说,它们只是隐藏动态数据结构的接口,而动态数据结构不像普通的具体类那样。特别是在创建NSMutableDictionary时,您将获得一个使用NSMutableDictionary接口的类,但实际上并不是NSMutableDictionary!这意味着返回的课程实际上不是你的班级,Yikes!子类NSMutableDictionary实际上是用自定义功能实现NSMutableDictionary接口。
您需要做的是让您的子类将数据结构作为成员变量(最简单的只是一个NSMutableDictionary)并在实现覆盖方法时使用该类。
示例:
@interface MyMutableDictionary : NSMutableDictionary
... interface methods ...
@end
和
@implementation MyMutableDictionary
{
NSMutableDictionary* _proxy;
}
- (id) init {
if (self = [super init]) {
_proxy = [[NSMutableDictionary alloc] init];
}
return self;
}
... implementation of methods ...
- (void) setObject:(id)obj forKey:(id)key {
if (obj) {
[_proxy setObject:obj forKey:key];
} else {
[_proxy removeObjectForKey:key];
}
}
@end
这个例子是一个人为的例子,它展示了如何实现一个自定义NSMutableDictionary,它在设置nil对象时不抛出异常,而是用该键删除对象。对于你需要直接使用forwardingTargetForSelector:方法的任何其他方法,你可以让你的_proxy成员接管任何未实现的方法(虽然你需要继承NSObject,并显式声明你想要的所有你想要的方法用于你的可变字典 - 这是因为否则将使用真正的NSMutableDictionary方法,这将无法工作)。
- (id) forwardingTargetForSelector:(SEL)aSelector
{
return _proxy;
}