3

この方法がある場合:

+ (NSDictionary *)dictionaryFromQueryString:(NSString *)queryString
{
    NSMutableDictionary *this = [[NSMutableDictionary alloc] init];

    NSArray *fields = [queryString componentsSeparatedByString:@"&"];

    for(NSString *field in fields)
    {
        NSArray *fieldParts = [field componentsSeparatedByString:@"="];

        NSString *value = @"";

        if(fieldParts.count > 1)
        {
            value = [[fieldParts subarrayWithRange:NSMakeRange(1, fieldParts.count - 1)] componentsJoinedByString:@"="];
        }

        [this setObject:unescape(value) forKey:unescape(fieldParts[0])];
    }

    return this;
}

NSMutableDictionary代わりに aを返すのは悪い習慣NSDictionaryですか?

NSDictionarywithに変換する必要がありreturn [this copy];ますか?

4

3 に答える 3

5

場合によります。

セルジオの答えは正しいですが、非常に重要な問題が 1 つあります。

変更可能な辞書を含むオブジェクトが、別のオブジェクトが辞書を取得した後に辞書を変更するとどうなりますか? その他のオブジェクトが、ディクショナリが変更される可能性をサポートするために特別に作成されていない限り、他のオブジェクトは一貫性のない状態になります。

ディクショナリは浅い不変コピーであるため高速であることを考えるとcopy、通常、可変バージョンへの参照を返すよりも、常にコピーを返す方がはるかに優れています。コピーを作成するメソッドにコードが集中していることがわかった場合は、不変のコピーをオブジェクトにキャッシュし、それを販売して、可変のバッキング ストアが変更されるたびにそれを無効にします。

于 2012-09-12T17:32:19.387 に答える
2

悪い習慣だとは思いません。これを行うことの最終的な効果は、オブジェクトの受信者がNSDictionaryオブジェクトを変更しようとしないことです (オブジェクトは変更可能ですが)。これは完全に安全であり、消費者メソッドがより一般的に保たれているため理にかなっています (変更可能なオブジェクトと変更不可能なオブジェクトの両方で機能します)。

于 2012-09-12T17:26:48.993 に答える
0

この方法で不変オブジェクトを返すことは、実際には悪い習慣ではありませ。これはポリモーフィズムなので、「大丈夫」です。NSMutableDictionaryNSDictionary

しかし、とにかく次のような自動解放されたコピーを返すでしょう:

return [NSDictionary dictionaryWithDictionary:this];
于 2012-09-12T17:32:55.207 に答える