Fla*_*ino 3 cocoa objective-c nsdictionary nsview
我正在尝试创建一组半复杂的视图动画(想想一个NSMatrix表单的动画版本,其中行在添加或删除其他行时滑动),并构建动画我正在制作一个小帮助类.
在那里,我必须跟踪不同的视图,他们的有序索引,以及与他们的动画相关的一些其他值.
为此,我正在使用一个NSArray实例来跟踪视图的排序(索引),并且我想使用NSDictionary带有视图作为键来跟踪值(值本身在嵌套字典中) ).即我希望能够做一些这样的事情,例如(伪代码):
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
}
Run Code Online (Sandbox Code Playgroud)
问题是,我当然不能将NSView实例用作字典键,因为键是使用添加的copyWithZone,而NSView不是实现.
那么,为NSView实例获取唯一键的好方法是什么?我可以想象使用,[obj description]因为你得到的内存地址是一个完美的UID,但当然系统必须使用任何类型的NSView子类,可能完全返回其他东西,所以这是不好的.
或者我应该完全尝试其他的东西?可能有一些替代方案NSDictionary,其中键不被复制?因为在这种情况下我真的不需要复制密钥.
有时,要使用一个视图(是否场合NS或UI)作为在字典中的关键.我遇到过这种情况.我宁愿使用objc_setAssociatedObject,但这需要Snow Leopard.拳击与NSValue将工作,但如果你需要做很多很多的观察视图,指针的持续装箱和拆箱可能会变得单调乏味.
创建NSView => <object>字典有两种选择.
NSMapTableCFMutableDictionaryRefNSMapTable是一个10.5中引入的类,它非常类似于一个类NSMutableDictionary,除了它具有额外的功能,使其更好地与垃圾收集工作.在您的情况下,您可能想要一个带有"弱"键和"强"值的地图表,但请阅读文档以获取所有有趣的详细信息.
CFMutableDictionaryRef是Core Foundation相当于NSDictionary(它们是免费桥接),但它有一些额外的创建选项.您使用创建一个CFDictionaryCreateMutable(),并且需要两个struct参数.一种是定义如何处理字典的键的内存管理(和其他)行为的结构,另一种是struct用于定义值的行为的结构.您可以创建一个CFMutableDictionaryRef选项,保留键(而不是复制它们),然后保留值.完成此操作后,您可以将其转换CFMutableDictionaryRef为an NSMutableDictionary并按预期使用它,只需保留密钥而不是复制密钥.
| 归档时间: |
|
| 查看次数: |
914 次 |
| 最近记录: |