【问题标题】:NSHTTPURLResponse allHeaderFields case sensitivityNSHTTPURLResponse allHeaderFields 区分大小写
【发布时间】:2013-12-01 13:06:57
【问题描述】:

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

两者似乎都是NSCFDictionary的实例;

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

手动创建的NSDictionary *a = @{ @"content-type" : @"pillows" } 为除小写“内容类型”以外的任何拼写返回nil

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

【问题讨论】:

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


    【解决方案1】:

    它们都不是 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 对于 __NSDictionaryI: __NSDictionaryI 检查调试输出:

    (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 通过一些私有的 Foundation 字典类完成的。

    【讨论】:

    • @Daij-Djan 我拼错了,你是对的。编辑。不,我实际上是对的 - __NSDictionaryI 区分大小写,__NSCFDictionary 不区分大小写
    • 那么类名具有误导性;)但无论如何都不是普通的字典
    • 他们可以使用具有 isEqual 不区分大小写的自定义 NSString 对象
    • 这很奇怪——我在 7.0 的模拟器上使用 AFNetworking 测试它(这似乎几乎不是问题),两种情况下都显示 __NSCFDictionary
    • 这个答案和我的一样没用:D - 实施细节。虽然努力:D
    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 2012-12-01
    • 2013-03-06
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多