NSDictionary:仅为抽象类定义的方法.我的应用程序崩溃了

Vol*_*da2 22 crash nsdictionary ios

我调用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:]!'
Run Code Online (Sandbox Code Playgroud)

我的代码

- (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
Run Code Online (Sandbox Code Playgroud)

Amy*_*all 42

你是NSDictionary的子类吗?这在Cocoa-land中并不常见,这可能解释了为什么你没有看到你期望的结果.

NSDictionary是一个类集群.这意味着你从来没有真正使用过NSDictionary的实例,而是使用它的一个私有子类.请在此处查看Apple对类集群的描述.从那个文档:

您可以像创建任何其他类一样创建集群实例并与之交互.但是,在幕后,当您创建公共类的实例时,该类将根据您调用的创建方法返回相应子类的对象.(您不能也不能选择实例的实际类.)

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

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

您还可以尝试使用关联引用,"模拟将对象实例变量添加到现有类".这样,您可以将NSNumber与现有字典关联以表示标记,并且不需要子类化.

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


Hlu*_*ung 5

/sf/answers/83394601/,这是我为使NSDictionary的子类工作所做的.我只是将NSDictionary声明为我的类的实例变量,并添加一些更多必需的方法.它被称为"复合对象" - 感谢@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
Run Code Online (Sandbox Code Playgroud)