NSHTTPURLResponse allHeaderFields区分大小写

时间:2013-12-01 13:06:58

标签: objective-c nsdictionary key-value-observing

为什么-[[NSHTTPURLResponse allHeaderFields] valueForKey:]不区分大小写,而valueForKey:手动创建的NSDictionary不是?

两者似乎都是NSCFDictionary;

的实例

使用变体,第一个推,Content-Typecontent-typeConTEnt-TYPe返回相同的值

手动创建的NSDictionary *a = @{ @"content-type" : @"pillows" }返回nil以获取除小写“content-type”之外的任何拼写

修改当下降到核心基础级别时,可以轻松实现此行为:https://gist.github.com/steipete/7739473

1 个答案:

答案 0 :(得分: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

因此,似乎只有NSMutableDictionary的__NSCFDictionary子类具有不区分大小写的键。
并且..我认为它是通过-objectForKey: -setObject:forKey:实现的。不是通过自定义NSString的 此外,这个__NSCFDictionary是NSMutableDictionary的不可变子类..它会覆盖setObject:forKey:以引发异常。
所以简短的回答是:
这是Apple通过一些私人基金会词典课程完成的。