5

iOS 5.1 を搭載した iPhone 3G で実行すると、カテゴリ メソッドの 1 つがオーバーライドされるという奇妙な動作が発生します。

私はこのカテゴリを持っています:

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

NSString キーと NSArray 値 (URL に同じ名前の複数のパラメーター) を含む辞書を返します。

期待していた NSArray の代わりに値として NSString を持つ NSDictionary を取得する上記のデバイスを除いて、正常に動作します (私の 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;
    // }

だから私は2つの質問があります:

  • このメソッドが Apple プライベート API (またはその他のもの) に属しているかどうかは誰にもわかりませんか?

編集:このページiOS6-Private-Frameworksによると、この「queryParameters」は NSURL の文書化されていないメソッドです (ただし、場合によってはオーバーライドされた理由は説明されていません)。

  • 「自分の」メソッドがこの「プライベート」メソッドによってオーバーライドされるのはなぜですか?

注意:この衝突を避けるために、私は自分のメソッドの名前を変更しました。

4

1 に答える 1

1

ここでの慣習は、名前の衝突を避けるために、制御下にないクラスのカテゴリメソッドにプレフィックスを付けることでもあると思います!

于 2012-11-29T13:40:03.470 に答える