小编eba*_*lio的帖子

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

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

我有这个类别:

@interface NSURL (queryParameters)
    - (NSDictionary *) queryParameters;
@end
Run Code Online (Sandbox Code Playgroud)

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

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

我创建了一个空项目,我在其中构建了一个虚拟NSURL,并发现它响应了选择器"queryParameters",并返回一个NSDictionary,其中NSString为值:

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;
    // }
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  • 有谁知道这种方法是否属于Apple私有api(或其他任何东西)?

编辑:根据这个页面iOS6-Private-Frameworks,这个"queryParameters"是NSURL的一个未记录的方法(但这并没有解释为什么在某些情况下它被覆盖).

  • 为什么我的"自己的"方法被这种"私有"方法所覆盖?

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

objective-c nsurl categories ios

5
推荐指数
1
解决办法
222
查看次数

标签 统计

categories ×1

ios ×1

nsurl ×1

objective-c ×1