【问题标题】:Objective-C HashMap equivalentObjective-C HashMap 等价物
【发布时间】:2011-12-29 16:48:06
【问题描述】:

我正在尝试转换一段使用 HashMap 的 Java 代码,该 HashMap 包含作为键的对象和作为对象的值。

private static HashMap<Class<? extends Component>, ComponentType> componentTypes = new HashMap<Class<? extends Component>, ComponentType>();

我一直在阅读如何使用 Obj-C 执行此操作,但我没有成功,大多数人建议使用 NSDictionary,问题是它们的键需要是字符串,而我需要它们作为对象。另一个选项是 NSMapTable,但它在 iOS 上不可用。有人可以帮助我如何将其转换为 obj-c 等价物吗?

谢谢,

【问题讨论】:

    标签: objective-c cocoa-touch hashmap


    【解决方案1】:

    NSDictionary 的键不必是字符串。它们可以是任何实现NSCopying 的对象。但是,如果对象是自定义对象,则它需要对-hash-isEqual: 消息产生合理的响应,但这与在 Java 集合中使用对象相同,因此应该不会有太大的挑战.

    【讨论】:

      【解决方案2】:

      您想使用NSDictionary。你这么说

      它们的键需要是字符串,我需要它们作为对象

      NSDictionary 的键不必是字符串——它们可以是任何符合 NSCopying 协议的对象。

      【讨论】:

      • 这是正确的。请注意,NSDictionary 确实 需要字符串键的一种常见情况是:如果 NSDictionary 预计将用于属性列表。
      【解决方案3】:

      NSMutableDictionary(假设您还需要在字典初始化后设置值)有两种工作方式:

      1. 作为传统的字典/哈希图,您可以在其中设置如下值:

        [myDictionary setObject: theValue forKey: anyObject];

      2. 作为具有符合 KVC 的属性的对象,碰巧是动态定义的:

        [myDictionary setValue: theValue forKey: aString];

      如果键是NSString,那么两者是可以互换的,除了不能用setObject:forKey: 将对象设置为nil,但可以将nil 传递给setValue:forKey:

      【讨论】:

        【解决方案4】:

        来自NSDictionary reference

        字典中的键值对称为条目。每个条目由一个表示键的对象和另一个表示该键的值的对象组成。在字典中,键是唯一的。也就是说,单个字典中没有两个键是相等的(由 isEqual: 确定)。一般来说,键可以是任何对象(只要它符合 NSCopying 协议——见下文),但请注意,当使用键值编码时,键必须是字符串(参见“键值编码基础”)。键和值都不能为 nil;如果你需要在字典中表示一个空值,你应该使用 NSNull。

        所以任何符合 NSCopying 协议的对象都可以作为 key。字符串限制仅适用于用于 Cocoa 绑定的键值编码

        【讨论】:

          【解决方案5】:

          我推断您使用的密钥不符合 NSCopying 协议。在这种情况下,请尝试使用与 NSDictionary 等效的 Core Foundation:CFDictionary。

          http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

          只需确保在使用 CFDictionary 时,所有对象都将在对象的持续时间内保留在内存中。由于 CFDictionary 必须使用弱引用进行设置(至少在我的经验中如此),因此请注意不要在某个对象仍在 CFDictionary 中时意外释放它。

          虽然 CFDictionary 与其 Cocoa Foundation 对应的 NSDictionary “免费桥接”,但我发现这仍然存在问题。我尝试将不属于 NSCopying 协议的对象添加到我的免费桥接 NSDictionary 中,但它在运行时出现错误。

          CFDictionary 文档:http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

          如果您需要可变性,请改用 CFMutableDictionary,如下所示: cfd = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); CFDictionaryAddValue(cfd, key, value); CFRelease(cfd);

          CFMutableDictionary 文档:http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFMutableDictionaryRef/Reference/reference.html#//apple_ref/doc/uid/20001497

          【讨论】:

          • 您好,感谢您的所有回复。如果我使用 ARC 并且使用 CFDictionary,我还需要处理内存吗?
          • 如果您将 ARC 与 CFDictionary 一起使用,则必须处理内存,除非您决定使用免费桥接。我个人无法让免费桥接为我正常工作,因为它一直试图复制不符合 NSCopying 的对象
          • 这里有更多关于此事的信息向下滚动到免费桥接部分developer.apple.com/library/ios/releasenotes/ObjectiveC/…
          猜你喜欢
          • 2010-11-19
          • 2022-12-08
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多