objective-c - 使用 NSView 实例作为 NSDictionary 键?

标签 objective-c cocoa nsdictionary nsview

我正在尝试创建一组半复杂的 View 动画(想想 NSMatrix 表单的动画版本,其中行随着其他行的添加或删除而滑动),并构建我正在制作一个小助手类的动画。

在那里,我必须跟踪不同的 View 、它们的有序索引以及一些与其动画相关的其他值。

为此,我使用 NSArray 实例来跟踪 View 的排序(索引),并且我想使用 NSDictionary使用 View 作为键来跟踪值(值本身位于嵌套字典中)。 IE。我希望能够做一些事情,例如(伪代码):

NSMutableDictionary* viewValuesDict = [NSDictionary dictionary];

// Loop thru an ordered NSArray
for( (NSView*) view in viewsArray ) {
    // Get some values we'll need later
    NSDictionary* associatedValues = [view getSomeValues];

    // ...and put them into viewValuesDict...
    [viewValuesDict setObject:associatedValues forKey:view];

    // and then things break because the NSView 'view'
    // doesn't support copyWithZone.... darn
}

问题是,我当然不能使用 NSView 实例作为字典键,因为这些键是使用 copyWithZone 添加的,其中 NSView 未实现。

那么,获取 NSView 实例的唯一 key 的好方法是什么?我可以想象使用 [obj description] 因为你返回的内存地址是一个完美的 UID,但是当然系统必须与任何类型的 NSView 子类一起工作完全返回其他东西,所以这是不好的。

或者我应该尝试完全不同的东西吗?是否有一些替代 NSDictionary 的方法,其中键不被复制?因为在这种情况下,我确实不需要复制 key 。

最佳答案

有时,您希望使用 View (无论是 NSUI )作为字典中的键。我就遇到过这样一种情况。我更愿意使用 objc_setAssociatedObject ,但这需要雪豹。拳击与 NSValue会起作用,但是如果您需要在给定 View 的情况下进行大量查找,则指针的连续装箱和拆箱可能会变得乏味。

有两个选项可以创建 NSView => <object>字典。

  1. 使用NSMapTable
  2. 使用CFMutableDictionaryRef

NSMapTable 是 10.5 中引入的一个类,与 NSMutableDictionary 非常相似。 ,除了它具有额外的功能,使其能够更好地处理垃圾收集。在您的情况下,您可能需要一个具有“弱”键和“强”值的 map 表,但请阅读文档以了解所有有趣的详细信息。

CFMutableDictionaryRef 核心基础相当于 NSDictionary (它们是免费桥接的),但它有一些额外的创建选项。您可以使用 CFDictionaryCreateMutable() 创建一个,需要两个 struct参数。一个是定义如何处理字典键的内存管理(和其他)行为的结构,另一个是 struct用于定义值的行为。您可以创建CFMutableDictionaryRef可以选择保留 key (而不是复制它们),然后保留值。完成此操作后,您可以转换 CFMutableDictionaryRefNSMutableDictionary并按照您的预期使用它,只是 key 将被保留而不是复制。

关于objective-c - 使用 NSView 实例作为 NSDictionary 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4361152/

相关文章:

objective-c - 如何过滤 NSDictionary 和 NSDictionary 数组?

ios - 如何使用仅返回后缀数字的函数扩展 NSString?

ios - UIView 在旋转时重新排列

ios - 如何修复 iOS 7 状态栏的高度和宽度问题

objective-c - 将工具栏与多个 NSViewController 一起使用

java - 如何在 XCode 中从 "Java JNI Application"模板开始使用 Objective-C?

objective-c - 如何在 objective-c 中实现 Perl 哈希?

ios - NSDictionary 丢失数据?

objective-c - NSMutableDictionary 不是线程安全的 : So?

python - 如何处理返回 NSError 的 PyObjC 方法?