0

由于 iOS 中没有 Collection 用于 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
4

1 回答 1

0

这就是为什么你不应该继承 Cocoa 集合类。(顺便说一句,异常信息是一个非常清晰,有意义的英文句子。请阅读并理解它。

OrderedMapTable* orderedMapTable = [super strongToStrongObjectsMapTable];

这调用super- 创建 的实例NSMapTable,而不是您自己的子类的实例,当然,它没有keyIndexArray属性。

一种可能的解决方案:在创建的实例上分配self并调用指定的初始化程序。

OrderedMapTable *map = [[self alloc] initWithKeyOptions: NSMapTableStrongMemory valueOptions: NSMapTableStrongMemory capacity:0];

忽略上述内容,正如您也提到的,它不起作用,该initWithKeyOptions:valueOptions:capacity:方法总是创建一个私有子类的实例。您对此无能为力。基本上忘记子类化。

于 2013-05-23T07:30:00.797 回答