NSNumber numberWithInt 当作为对象添加到 NSDictionary 时会导致 NSNull

问题描述 投票:0回答:1

这可能是一个相当基本的问题,但尽我所能,我找不到导致它的原因。

我写了以下代码:

    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]
在作为对象添加到
myDictionary
时被解释为 NSNull,而相同的表达式在添加到 NSArray
values
时被视为对象。

和记录

myDictionary
我注意到这确实是正在发生的事情。谁能帮我解释一下为什么吗?

ios objective-c nsdictionary nsnumber nsnull
1个回答
1
投票

如果您没有覆盖

-isEqual:
-hash
,则
CustomObjectAdoptingNSCopy
的副本彼此不相等。
NSObject
的默认平等实现是对象标识。由于
NSDictionary
复制了键,但副本不等于原始键,因此您无法从字典中检索任何内容,除非您向字典询问其键并使用它们。原来的不行。

© www.soinside.com 2019 - 2024. All rights reserved.