gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:00:44 25 4
gpt4 key购买 nike

我的应用在调用 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

最佳答案

你在继承 NSDictionary 吗?这在 Cocoa-land 并不常见,这或许可以解释为什么您没有看到预期的结果。

NSDictionary 是一个类簇。这意味着您永远不会真正使用 NSDictionary 的实例,而是使用它的私有(private)子类之一。请参阅 Apple 对类集群的描述 here .来自那个文档:

You create and interact with instances of the cluster just as you would any other class. Behind the scenes, though, when you create an instance of the public class, the class returns an object of the appropriate subclass based on the creation method that you invoke. (You don’t, and can’t, choose the actual class of the instance.)

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

假设您确实想要子类化 NSDictionary,最好的办法是编写您的子类以包含一个普通的 NSMutableDictionary 作为属性,并使用它来处理您的存储。 This tutorial向您展示一种方法来做到这一点。这实际上并不难,您只需要将所需的方法传递给您的字典属性即可。

您也可以尝试使用 associative references ,它“模拟将对象实例变量添加到现有类中”。这样你就可以将一个 NSNumber 与你现有的字典相关联来表示标签,并且不需要子类化。

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

关于ios - NSDictionary:仅为抽象类定义的方法。我的应用程序崩溃了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com