Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSMutableDictionary在处理NSNumber时基于对象的地址或值进行查找?_Iphone_Objective C_Cocoa_Cocoa Touch - Fatal编程技术网

Iphone 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

如果将NSNumber*存储为NSMutableDictionary的键,它是否会在以后根据键的地址或存储值进行查找?似乎如果我将NSNumber存储在两个字典中,其中一个字典的值用作另一个字典的键,有时,即使我确定第二个字典中有键,也找不到该键

我想做的是:

// 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?我很难链接到它。嗯,可能不是。看到这个了吗