NSMutableDictionary поиск на основе адреса объекта или значения при работе с NSNumber? - PullRequest
1 голос
/ 09 октября 2009

Если вы храните NSNumber * в качестве ключа к NSMutableDictionary, выполняет ли он поиск позже на основе адреса ключа или сохраненного значения? Кажется, что если я храню NSNumber в двух словарях со значением от одного, служащего ключом к другому, иногда, ключ не найден во 2-м словаре, хотя я уверен, что он там.

Я пытаюсь сделать следующее:

// fetch the items from Coredata and create two different lookups
NSArray *existingActions = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (SomeObject *someObject in existingActions)
{
    NSNumber *actionId = [someObject actionId];
    [actionMap setObject:someObject forKey: actionId];

    NSNumber *positionId = [someObject positionId];
    [positionMap setObject: actionId forKey: positionId];
}

// later on, I'm trying to print out the values from both lookups now    
NSEnumerator *enumerator = [positionMap keyEnumerator];
NSNumber *positionId;

while ((positionId = (NSNumber *)[enumerator nextObject])) 
{
   NSNumber *actionId = (NSNumber *)[positionMap objectForKey:positionId];
   SomeObject * myObj =  (SomeObject *) [actionMap objectForKey:actionId];      

   NSLog(@"myObj: %@", myObj];
}   

// This way yields the same result as above:
NSNumber *positionId = [NSNumber numberWithInt: 7]; // filled out by client
NSNumber *actionId = (NSNumber *)[positionMap objectForKey:positionId];
SomeObject *myObj = (SomeObject *)[actionMap objectForKey: actionId];

Часто myObj имеет значение null, поскольку objectForKey не может найти объект, связанный с actionId, в словаре actionMap.

В качестве дополнительного примечания класс SomeObject является производным от NSManagedObject. Документация для setObject: forKey: примечания для параметров, переданных в:

aKey: ключ для значения. Ключ скопированы (используя copyWithZone :; ключи должны соответствовать протоколу NSCopying). Ключ не должен быть равен нулю.

Это связано с тем, что copyWithZone может отличаться от классов NSManagedObject?

Что я здесь не так делаю?

Ответы [ 3 ]

3 голосов
/ 09 октября 2009

используется значение, которое возвращает -hash.

1 голос
/ 09 октября 2009

Оказывается, проблема в том, что свойство actionId, возвращаемое [someObject actionId], является слабой ссылкой, и вы не можете сохранить его в NSDictionary, не сделав его копию.

Вместо:

NSNumber * actionId = [someObject actionId]; [actionMap setObject: someObject forKey: actionId];

это работает:

NSNumber * actionId = [NSNumber numberWithInt: [[someObject actionId] intValue]]; [actionMap setObject: someObject forKey: actionId];

0 голосов
/ 09 октября 2009

Вы можете использовать NSMapTable как NSDictionary, но без копирования ключей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...