NSURL隐藏方法queryParameters可以覆盖类别

时间:2012-11-29 11:00:13

标签: objective-c ios categories nsurl

我有这种奇怪的行为,当我在iphone 5.1的iPhone 3G上运行时,我的一个类别方法会被覆盖。

我有这个类别:

@interface NSURL (queryParameters)
    - (NSDictionary *) queryParameters;
@end

返回带有NSString键和NSArray值的字典(我的url中有多个具有相同名称的参数)。

除了在上面提到的设备上,我得到一个带有NSString的NSDictionary作为值而不是我期望的NSArray(对应于我的url中的最后一个参数),它工作正常。

我创建了一个空项目,我在其中构建了一个伪NSURL,并发现它响应了选择器“queryParameters”,并返回一个带有NSString的NSDictionary作为值:

NSString *urlString = @"http://dummy.url?foo=bar1&foo=bar2";
NSURL *url = [NSURL URLWithString:urlString];

NSLog(@"%@", [url respondsToSelector:@selector(queryParameters)]?@"YES":@"NO");
    // YES

NSLog(@"%@", [[url performSelector:@selector(queryParameters)] debugDescription]);
    // {
    //     foo = bar2;
    // }

所以我有两个问题:

  • 是否有人知道此方法是否属于Apple私有API(或其他任何内容)?

编辑:根据此页面iOS6-Private-Frameworks,此“queryParameters”是NSURL的未记录方法(但这并不能解释为什么在某些情况下会被覆盖)。

  • 为什么我的“自己的”方法会被这种“私有”方法覆盖?

备注:我最终重命名了自己的方法以避免这种冲突。

1 个答案:

答案 0 :(得分:1)

我认为这里的约定也是在您不受控制的类上为您的类别方法添加前缀,以避免任何名称冲突!