在Objective-C中将NS分配给NSMutableDictionary上的元素会删除该元素,这是一个受制裁的功能还是错误?

时间:2015-09-20 12:28:23

标签: ios iphone nsmutabledictionary

我有NSMutableDictionary

NSMutableDictionary * dict = @{
                                @"0" : @"car",
                                @"1" : @"ball",
                                @"2" : @"plane",
}

有一次,由于错误,我正在为字典上的元素分配一个nil。例如:

  dict[@"1"] = nil; 

令我惊讶的是,而不是崩溃,元素" 1"正在删除。

这是近期的事吗?受制裁的功能还是错误?我想知道这是否是一个功能,因为我总是使用像

这样的东西
[dict removeObjectForKey:@"1"];

从字典中删除对象。

我从来不知道这是可能的。也许Apple正在使Objective-C与Swift相似。

2 个答案:

答案 0 :(得分:8)

我刚刚验证了Swift 2.0中的行为。

var dict: NSMutableDictionary = [ "0" : "car", "1" : "ball", "2" : "plane" ];
dict["1"] = nil
print("\(dict)")

它必须是一个bug,因为它与文档相矛盾。

来自NSMutableDictionary Class Reference

  

- setObject:forKeyedSubscript:   将给定的键值对添加到字典中。

     

声明

     

目的-C

     

- (void)setObject:(ObjectType)对象
  forKeyedSubscript:(ID)的aKey

     

参数

     宾语      

aKey的值。字典维护了对象的强引用。

     重要      

如果anObject为nil ,则引发NSInvalidArgumentException。如果需要在字典中表示nil值,请使用NSNull。

     关键      

价值的关键。密钥被复制(使用copyWithZone:;密钥必须符合NSCopying协议)。如果字典中已存在aKey,则anObject取代它。

     重要      

如果aKey为nil,则引发NSInvalidArgumentException。

更新时间:2016-04-21

Apple更新了它的文档!传递nil值可用于删除密钥。

  宾语      

aKey的值。字典维护了对象的强引用。

     

传递nil会导致对应于aKey的任何对象从字典中删除。

答案 1 :(得分:0)

有不同的 API 可以将对象添加到可变字典,并且当您传递 nil 时它们的行为会有所不同:

  • setObject:forKeyedSubscript:(又名 dict[key] = nil)和 setValue:forKey: 接受 nil,在这种情况下,它们将删除与该键对应的对象。
  • setObject:forKey: 如果通过 nil 将引发异常

所有这些都记录在 https://developer.apple.com/documentation/foundation/nsmutabledictionary