objective-c - NSHTTPURLResponse allHeaderFields 区分大小写

标签 objective-c nsdictionary key-value-observing

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

两者似乎都是 NSCFDictionary 的实例;

Content-Typecontent-typeConTEnt-TYPe 的变体戳第一个返回相同的值

手动创建的 NSDictionary *a = @{ @"content-type": @"pillows"} 返回 nil 除了小写的 "content-type"

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

最佳答案

它们不都是 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 通过一些私有(private)的 Foundation 字典类完成的。

关于objective-c - NSHTTPURLResponse allHeaderFields 区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312420/

相关文章:

ios - 使用 NSMutableData iOS 进行键值观察

objective-c - 将 AFNetworking POST constructingBodyWithBlock 从 Objective C 翻译成 Swift

iphone - XCode 中 C 库的链接问题 - 文件是为不受支持的文件格式构建的,该格式不是正在链接的体系结构

ios - 如何从用户默认值 swift3 的字典数组中删除特定键值

ios - 如何在 Swift 中为 UserDefaults 使用 KVO?

ios - 观察 UIViewPropertyAnimator 运行问题

objective-c - NSError 背后的概念

iphone - 在方向锁定的情况下强制相机在风景中查看

objective-c - 当返回值是不可变对象(immutable对象)时返回可变对象是不好的做法吗?

IOS 如何将索引中的字典数组项与另一个 NSarray 索引项进行比较