使用对象作为NSDictionary的键

Wil*_*ken 14 iphone objective-c ios

我有一堆Lessons,这个班很棒.有一个视图控制器可以使用这些课程.这个控制器需要知道a的上传状态,lesson所以我们有一个带有Lessonas键的NSDictionary 和一个NSNumber具有上传状态的百分比.

这是一个问题,因为在您插入之后,Lesson您希望稍后对其进行查找Lesson(可能在中cellForRowAtIndexPath:)以获得进度.这不起作用,因为密钥是在NSDictionary中复制的.

保存和获取密钥的好方法是这样的:

NSNumber *key = [NSNumber numberWithUnsignedInt:[obj hash]];
[dict setObject:@"... upload progress" forKey:key];
Run Code Online (Sandbox Code Playgroud)

还是有更好的方法?

Chr*_*hey 37

我过去曾经多次使用过这种技术,并且通过将关键对象包装到NSValue中取得了很大的成功:

NSValue *myKey = [NSValue valueWithNonretainedObject:anInstance];
id anItem =[myDict objectForKey:myKey];
Run Code Online (Sandbox Code Playgroud)

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html#//apple_ref/occ/clm/NSValue/valueWithNonretainedObject:

(原谅格式化;我在iPhone上.我稍后会格式化:-)

  • `NSMapTable`也是一个选项.它的行为类似于`NSDictionary`,但允许在其他选项之上对其键进行弱引用. (5认同)

Tim*_*Tim 5

仅仅离开这句话:“这不起作用,因为键是在 NSDictionary 中复制的。” 您是否尝试过在课程中实施-isEqual:并实施?-hash我愿意打赌,如果您用于查找的课程和字典中作为键复制的课程进行-isEqual:比较YES时,您会没事的。


Sma*_*ess 5

UIView *view = [[UIView alloc] init];           
NSMapTable *dict = [NSMapTable weakToStrongObjectsMapTable];
[dict setObject:[NSNumber numberWithInt:1234] forKey:view];
NSNumber *x = [table objectForKey:view];
Run Code Online (Sandbox Code Playgroud)