由于iOS中没有Ordered NSMapTable的集合(长篇故事,为什么我首先需要一个:))我尝试将其子类化并自己实现。
不幸的是,我面临一些奇怪的问题:
我无法添加属性甚至覆盖init方法。
我总是得到一个提示:
未捕获的异常:
-[NSConcreteMapTable setKeyIndexArray:]
:无法识别的选择器发送到实例
这是我的代码:
OrderedMapTable.h :
@interface OrderedMapTable : NSMapTable
-(id) objectAtIndex:(NSUInteger)index;
-(id) keyAtIndex:(NSUInteger)index;
@end
OrderedMapTable.m :
@interface OrderedMapTable()
@property (nonatomic, strong) NSMutableArray* keyIndexArray;
@end
@implementation OrderedMapTable
+(id)strongToStrongObjectsMapTable
{
OrderedMapTable* orderedMapTable = [super strongToStrongObjectsMapTable];
orderedMapTable.keyIndexArray = [[NSMutableArray alloc] init];
return orderedMapTable;
}
...
@end
答案 0 :(得分:0)
这就是为什么你不应该继承Cocoa集合类的原因。 (顺便说一下,异常消息是一个非常清晰,有意义的英语句子。阅读并理解它。)
OrderedMapTable* orderedMapTable = [super strongToStrongObjectsMapTable];
调用super
- 创建NSMapTable
的实例,而不是您自己的子类的实例,当然,它没有keyIndexArray
属性。< / p>
一种可能的解决方案:分配 self
并在创建的实例上调用指定的初始化程序。
OrderedMapTable *map = [[self alloc] initWithKeyOptions: NSMapTableStrongMemory valueOptions: NSMapTableStrongMemory capacity:0];
如上所述,忽略上述内容,它不起作用,initWithKeyOptions:valueOptions:capacity:
方法始终创建私有子类的实例。你无能为力。暂时忘记子类化。