【问题标题】:NSMutableDictionary lookup based on object's address or value when dealing with NSNumber?NSMutableDictionary 在处理 NSNumber 时基于对象的地址或值查找?
【发布时间】:2009-10-08 21:01:04
【问题描述】:

如果您将 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:; 键必须 符合 NSCopying 协议)。 键不能为 nil。

是不是因为 NSManagedObject 类的 copyWithZone 可能不同?

我在这里做错了什么?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    它使用 -hash 返回的值。

    【讨论】:

    • 当我尝试使用 '[actionId hash]' 获取 NSNumber 的哈希值时,它返回 null -- 这似乎不正确。
    • NSNumber *actionId = [someObject actionId]; NSLog(@"hash: %@", [actionId hash]); ==> 在调试控制台中产生:2009-10-08 15:18:14.229 MyTestApp[24644:20b] hash: (null)
    • - 哈希返回一个 NSUInteger。您的字符串格式 (%@) 不正确。
    • 使用正确的格式字符串,我看到了预期的哈希值,但总体结果与在 NSDictionary 中找不到预期的对象相同。
    【解决方案2】:

    事实证明,问题在于 [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];

    【讨论】:

      【解决方案3】:

      您可以像使用 NSDictionary 一样使用 NSMapTable,但无需复制键

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多