NSMutableOrderedSet和NSNull行为?

时间:2012-11-20 20:24:54

标签: iphone objective-c ios cocoa-touch syntax

我不明白为什么我不能将许多[NSNull null]添加到NSMutableOrderedSet:

NSMutableOrderedSet *set = [[NSMutableOrderedSet alloc]init];
for(int i = 0; i < 10; i++)
    {
        [set addObject: [NSNull null]];
    }

NSLog("SET COUNT : %d", set.count);

此输出:

SET COUNT : 1

如果我尝试使用NSMutableArray它可以正常工作,我已经阅读了NSNull文档(这很短但没有帮助)但是它说:

"The NSNull class defines a singleton object used to represent null values in collection objects"

和NSMutableOrderedSet文档,它说它是

"[...] ordered collection of distinct objects"

所以,如果它是一个集合,为什么它不起作用?

非常感谢

3 个答案:

答案 0 :(得分:2)

[NSNull null]始终返回相同的对象NSNull的单例实例)。

NSObject *a = [NSNull null];
NSObject *b = [NSNull null];
// a == b

NSMutableSetNSMutableOrderedSet不同对象的集合,因此它们最多只能包含此“空对象”的一个实例。

答案 1 :(得分:1)

NSOrderedSet及其子类NSMutableOrderedSet不能包含同一对象的多个副本。 NSNull singleton ,因此多次将其添加到集合中会导致只添加一个副本。

如果您希望能够将多个副本添加到一个集合中,请改为使用NSCountedSet

NSCountedSet set = [NSCountedSet set];
for(int i = 0; i < 10; i++)
{
    [set addObject: [NSNull null]];
}
NSLog(@"%ud", [set countForObject:[NSNull null]]);

答案 2 :(得分:1)

你的问题本身有答案。它说"ordered collection of distinct objects""The NSNull class defines a singleton object used to represent null values in collection objects"[NSNull null]不是一个独特的对象,它只有一个实例,因此计数表示1.您不能将"null"这样的多个NSMutableOrderedSet对象添加到{{1}}。