这可能是一个相当基本的问题,但尽管我尽力了,我还是找不到导致它的原因。
我写了以下代码:
NSMutableDictionary * myDictionary = [[NSMutableDictionary alloc] init];
NSMutableArray * values = [[NSMutableArray alloc] init];
for (int i=0; i<10; i++) {
// create an object that can become a key in an NSDictionary
CustomObjectAdoptingNSCopy * someKey = [[CustomObjectAdoptingNSCopy alloc] init];
// create a random value that will become an object for myDictionary ...
int someValue = rand()%10;
// ... and which also gets to be an object in the values array, provided it isn't already stored there
if ([values indexOfObject:[NSNumber numberWithInt:someValue]]==NSNotFound)
[values addObject:[NSNumber numberWithInt:someValue]];
// now associate someValue with someKey in myDictionary
[myDictionary setObject:[NSNumber numberWithInt:someValue] forKey:someKey];
}
// read the data in myDictionary enumerating the NSArray values
for (NSNumber * aValue in values){
NSArray * objectsForValue = [myDictionary allKeysForObject:aValue];
// now the data from objectsForValue are being used ...
}
当objectsForValue
为空时,问题就会显现出来,这种情况并非总是发生,而是经常发生。如果我没有错的话,这在逻辑上是不可能的,除非[NSNumber numberWithInt:someValue]
在作为Object添加到myDictionary
时被解释为NSNull,而同一表达式在添加到NSArray values
时被视为Object。
在记录myDictionary
时,我注意到这确实是正在发生的事情。有人能向我解释为什么吗?
如果没有重写-isEqual:
和-hash
,则CustomObjectAdoptingNSCopy
的副本不相等。NSObject
的默认相等实现是对象标识。由于NSDictionary
复制了密钥,但副本不等于原始密钥,除非你向字典索要密钥并使用它们,否则你无法从字典中检索到任何内容。原件不起作用。