NSHTTPURLResponse allHeaderFields 大小写敏感性问题

5
为什么-[[NSHTTPURLResponse allHeaderFields] valueForKey:]是不区分大小写的,而手动创建的NSDictionaryvalueForKey:不是?两者似乎都是NSCFDictionary实例;使用变化后的Content-Typecontent-typeConTEnt-TYPe对第一个进行测试可以得到相同的值,而手动创建的NSDictionary *a = @{ @"content-type" : @"pillows" }在除小写的"content-type"之外的任何拼写都返回nil编辑原来在降低核心基础水平时可以轻松地实现这种行为:https://gist.github.com/steipete/7739473
1个回答

4

它们不是两个NSCFDictionary

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response
{
    NSDictionary *dictionary1 = [(NSHTTPURLResponse*)response allHeaderFields];
    NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjects:[dictionary1 allValues] forKeys:[dictionary1 allKeys]];
}

在lldb中:

(lldb) po [dictionary2 class]
__NSDictionaryI
(lldb) po [dictionary1 class]
__NSCFDictionary

看起来 __NSCFDictionary 的键实际上是不区分大小写的 0_0。
__NSCFDictionary 的类继承关系如下: __NSCFDictinary <-- NSMutableDictionary <-- NSDictionary。
而对于 __NSDictionaryI: __NSDictionaryI <-- NSDictionary。
查看调试输出:

(lldb) po [dictionary1 superclass]
NSMutableDictionary
(lldb) po [[dictionary1 superclass] superclass]
NSDictionary
(lldb) po [dictionary2 superclass]
NSDictionary

我也创建了

NSMutableDictionary *dictionary3 = [dictionary2 mutableCopy];

并尝试过

(lldb) po [dictionary3 class]
__NSDictionaryM
(lldb) po [[dictionary3 class] superclass]
NSMutableDictionary
(lldb) po [[[dictionary3 class] superclass] superclass]
NSDictionary
(lldb) po dictionary3[@"date"]
 nil
(lldb) po dictionary3[@"Date"]
Sun, 01 Dec 2013 13:35:22 GMT

看起来只有__NSCFDictionary子类的NSMutableDictionary具有不区分大小写的键。
我认为这是通过-objectForKey:-setObject:forKey:实现的,而不是通过自定义NSString实现的。
此外,这个__NSCFDictionary是NSMutableDictionary的不可变子类。它重写了setObject:forKey:以抛出异常。
所以简短的答案是:
这是由苹果通过一些私有的Foundation词典类完成的。


@Daij-Djan 我拼错了,你是对的。编辑。不,我其实是对的 - __NSDictionaryI 是区分大小写的,而 __NSCFDictionary 则不区分大小写。 - Petro Korienev
那么如果类名具有误导性,但普通字典在任何情况下都不是解决方案。 - Daij-Djan
他们可以使用自定义的NSString对象,使isEqual不区分大小写。 - Daij-Djan
这很奇怪 - 我正在使用7.0模拟器测试使用AFNetworking(似乎很难是问题)并且对于两种情况都显示__NSCFDictionary - Sash Zats
这不适用于系统。NSCFDict不是NSMutableDict的子类,它是一个类簇(class cluster),据我所知。 - Daij-Djan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接