Iphone NSMutableDictionary在处理NSNumber时基于对象的地址或值进行查找?
如果将NSNumber*存储为NSMutableDictionary的键,它是否会在以后根据键的地址或存储值进行查找?似乎如果我将NSNumber存储在两个字典中,其中一个字典的值用作另一个字典的键,有时,即使我确定第二个字典中有键,也找不到该键 我想做的是:Iphone NSMutableDictionary在处理NSNumber时基于对象的地址或值进行查找?,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,如果将NSNumber*存储为NSMutableDictionary的键,它是否会在以后根据键的地址或存储值进行查找?似乎如果我将NSNumber存储在两个字典中,其中一个字典的值用作另一个字典的键,有时,即使我确定第二个字典中有键,也找不到该键 我想做的是: // fetch the items from Coredata and create two different lookups NSArray *existingActions = [managedObjectContext exec
// 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似乎无法在actionMap字典中找到与actionId关联的对象
另请注意,SomeObject类派生自“NSManagedObject”。setObject:forKey的文档:传入参数的注释:
aKey:价值的关键。关键是
使用copyWithZone复制:;钥匙必须
遵守NSCOPY协议。
密钥不能为零
这是因为copyWithZone可能与NSManagedObject类不同吗
我在这里做错了什么?它使用了-hash返回的值。它使用了-hash返回的值。您可以像NSDictionary一样使用NSMapTable,但不复制键。事实证明,问题在于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] 问题在于[someObject actionId]返回的actionId属性是一个弱引用,如果不复制它,就无法将其存储在NSDictionary中 而不是:
NSNumber*actionId=[someObject actionId]; [actionMap setObject:someObject-forKey:actionId] 这项工作: NSNumber*actionId=[NSNumber numberWithInt:[[someObject actionId]intValue]];
[actionMap setObject:someObject-forKey:actionId] 当我尝试使用“[actionId hash]”获取NSNumber的哈希值时,它返回null——这似乎不正确。NSNumber*actionId=[someObject actionId];NSLog@hash:%@[actionId哈希];==>调试控制台中的产量:2009-10-08 15:18:14.229 MyTestApp[24644:20b]哈希:null-哈希返回一个整数。您的字符串格式%@不正确。使用正确的格式字符串,我看到了预期的哈希值,但在NSDictionary中找不到预期对象的总体结果相同。当我尝试使用“[actionId hash]”获取NSNumber的哈希值时,它返回null-这似乎不正确。NSNumber*actionId=[someObject actionId];NSLog@hash:%@[actionId哈希];==>调试控制台中的产量:2009-10-08 15:18:14.229 MyTestApp[24644:20b]哈希:null-哈希返回一个整数。您的字符串格式%@不正确。使用正确的格式字符串,我可以看到预期的哈希值,但总的结果是在NSDictionary中找不到预期的对象。这是否适用于iPhoneSDK?我很难链接到它。嗯,可能不是。看到了吗?这是否适用于iPhoneSDK?我很难链接到它。嗯,可能不是。看到这个了吗