NSDictionary:只为抽象类定义的方法。 我的应用程序崩溃

我调用addImageToQueue后,我的应用程序崩溃了。 我添加了initWithObjects:forKeys:count:但它不帮助我。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSDictionary initWithObjects:forKeys:count:]: method only defined for abstract class. Define -[DictionaryWithTag initWithObjects:forKeys:count:]!' 

我的代码

 - (void)addImageToQueue:(NSDictionary *)dict { DictionaryWithTag *dictTag = [DictionaryWithTag dictionaryWithDictionary:dict]; } @interface DictionaryWithTag : NSDictionary @property (nonatomic, assign) int tag; - (id)initWithObjects:(id *)objects forKeys:(id *)keys count:(NSUInteger)count; @end @implementation DictionaryWithTag @synthesize tag; - (id)initWithObjects:(id *)objects forKeys:(id *)keys count:(NSUInteger)count { return [super initWithObjects:objects forKeys:keys count:count]; } @end 

你是inheritanceNSDictionary? 在Cocoa-land中这不是一件常见的事情,这也许可以解释为什么你没有看到你期望的结果。

NSDictionary是一个类集群。 这意味着你永远不会使用NSDictionary的实例,而是使用它的一个私有子类。 请参阅Apple 在此处的类集群描述。 从那个文件:

您可以像创build任何其他类一样创build集群的实例并与其进行交互。 但是,在幕后,当您创build公共类的实例时,该类基于您调用的创build方法返回适当子类的对象。 (你不能,也不能,select实例的实际类。)

你的错误信息告诉你的是,如果你想要NSDictionary的子类,你必须为它实现自己的后端存储(例如通过在C中编写一个哈希表)。 这不仅仅是要求你声明这个方法,而是要求你从头开始编写,自己处理存储。 这是因为像这样直接对类集群进行子类化就像说要为字典的工作方式提供新的实现一样。 我相信你可以知道,这是一个重要的任务。

假设你一定想要子类NSDictionary,最好的办法就是编写你的子类来包含一个普通的NSMutableDictionary属性,并用它来处理你的存储。 本教程向您展示了一种方法。 这实际上并不难,你只需要将所需的方法传递给你的字典属性。

您也可以尝试使用关联引用 ,它将“模拟对象实例variables添加到现有类”。 这样你就可以把NSNumber和现有的字典联系起来来表示这个标签,而且不需要子类化。

当然,你也可以将tag作为字典中的一个键,并将其存储在其中,就像任何其他字典键一样。

https://stackoverflow.com/a/1191351/467588 ,这是我做了NSDictionary的子类作品。 我只是声明一个NSDictionary作为我的类的实例variables,并添加一些所需的方法。 它被称为“复合对象” – 感谢@mahboudz。

 @interface MyCustomNSDictionary : NSDictionary { NSDictionary *_dict; } @end @implementation MyCustomNSDictionary - (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(NSUInteger)cnt { _dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:cnt]; return self; } - (NSUInteger)count { return [_dict count]; } - (id)objectForKey:(id)aKey { return [_dict objectForKey:aKey]; } - (NSEnumerator *)keyEnumerator { return [_dict keyEnumerator]; } @end 

我只是做了一个小动作。
我不确定它是否是最好的解决scheme(或者甚至是很好的解决scheme)。

 @interface MyDictionary : NSDictionary @end @implementation MyDictionary + (id) allocMyDictionary { return [[self alloc] init]; } - (id) init { self = (MyDictionary *)[[NSDictionary alloc] init]; return self; } @end 

这对我来说工作得很好。