我正在尝试创建一组半复杂的 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 (无论是 NS
或 UI
)作为字典中的键。我就遇到过这样一种情况。我更愿意使用 objc_setAssociatedObject
,但这需要雪豹。拳击与 NSValue
会起作用,但是如果您需要在给定 View 的情况下进行大量查找,则指针的连续装箱和拆箱可能会变得乏味。
有两个选项可以创建 NSView => <object>
字典。
- 使用
NSMapTable
- 使用
CFMutableDictionaryRef
NSMapTable
是 10.5 中引入的一个类,与 NSMutableDictionary
非常相似。 ,除了它具有额外的功能,使其能够更好地处理垃圾收集。在您的情况下,您可能需要一个具有“弱”键和“强”值的 map 表,但请阅读文档以了解所有有趣的详细信息。
CFMutableDictionaryRef
核心基础相当于 NSDictionary
(它们是免费桥接的),但它有一些额外的创建选项。您可以使用 CFDictionaryCreateMutable()
创建一个,需要两个 struct
参数。一个是定义如何处理字典键的内存管理(和其他)行为的结构,另一个是 struct
用于定义值的行为。您可以创建CFMutableDictionaryRef
可以选择保留 key (而不是复制它们),然后保留值。完成此操作后,您可以转换 CFMutableDictionaryRef
到NSMutableDictionary
并按照您的预期使用它,只是 key 将被保留而不是复制。
关于objective-c - 使用 NSView 实例作为 NSDictionary 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4361152/