Full Decent Full Decent - 1 month ago 14
iOS Question

Using an object as key for NSDictionary

I have a bunch of

Lesson
s and the class works great. There is a view controller that works with these lessons. This controller needs to know the upload status of a
lesson
so we have a NSDictionary with the
Lesson
as key and an
NSNumber
having the percent of upload status.

This is a problem because after you insert a
Lesson
you want to later do a lookup on that same
Lesson
(perhaps in
cellForRowAtIndexPath:
) to get the progress. This does not work because keys are copied in NSDictionary.

Is it good form to save and fetch keys with something like this:

NSNumber *key = [NSNumber numberWithUnsignedInt:[obj hash]];
[dict setObject:@"... upload progress" forKey:key];


Or there a better approach?

Answer

I have used this technique many times in the past, and have had great success by wrapping the key-objects into an NSValue:

NSValue *myKey = [NSValue valueWithNonretainedObject:anInstance];
id anItem =[myDict objectForKey:myKey];

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

(forgive the formatting; I'm on iPhone. I'll format later :-)