- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么 -[[NSHTTPURLResponse allHeaderFields] valueForKey:]
不区分大小写,而手动创建的 NSDictionary
的 valueForKey:
不区分大小写?
两者似乎都是 NSCFDictionary
的实例;
用 Content-Type
、content-type
、ConTEnt-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/
我正在使用 Alamofire 进行 API 调用。 根据我使用的服务器,响应 header 可以大写。 但是正如 allHeaderFields 的文档所说: var allHeaderFields
我正在使用AlamofireObjectMapper 来 self 的服务器的响应是 JSON 格式,但它还在 header 中包含一些键 Alamofire.request(URL).respons
如果我的应用程序是从 AppStore 下载的,那么在加载网页时它会经常崩溃,但我无法在 Debug模式下重复崩溃。崩溃日志说: -[NSURLResponse allHeaderFields]: u
我正在向 API 发出 POST 请求,并在 Swift 中成功获得响应。下面是我的代码。 private func getData(url: NSURL) { let config: NSU
我的代码的目的是比较服务器文件和本地文件的修改日期,如果服务器文件较新,它将下载它。 我的第一次尝试是使用 http://iphoneincubator.com/blog/server-communi
为什么 -[[NSHTTPURLResponse allHeaderFields] valueForKey:] 不区分大小写,而手动创建的 NSDictionary 的 valueForKey: 不区
我想知道在什么条件下 NSHTTPURLResponse 对象不会有键 @"Content-Length"?没有那把 key 是正常的吗? 我正在尝试使用 dropbox SDK 进行一些操作,并且我
我正在使用 OCMock 来模拟 NSURLConnection/NSURLResponse(是的,我知道这些已被弃用)并且一切正常,因为我希望它模拟 http 响应代码和 http 主体。现在我正在
转换到 Swift 3 时,我注意到一个奇怪的错误发生在从 HTTPURLResponse 读取 header 字段时。 let id = httpResponse.allHeaderFields["
我尝试使用以下行获取 NSURLRequest 的 header : NSString *contentType = [[(NSHTTPURLResponse *)data allHeaderFiel
我是一名优秀的程序员,十分优秀!