当返回值是不可变对象时,返回可变对象是不好的做法吗?

Tyi*_*ilo 3 objective-c nsdictionary immutability nsmutabledictionary

如果我有这个方法:

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

那么我回到一个NSMutableDictionary而不是一个不好的做法NSDictionary吗?

我应该将其转换为一个NSDictionaryreturn [this copy];

bbu*_*bum 5

这取决于.

塞尔吉奥的答案是正确的,除了一个非常重要的问题:

当包含可变字典的对象在另一个对象检索字典后改变字典时会发生什么?除非专门编写其他对象以支持字典可能变异的可能性,否则另一个对象现在将处于不一致状态.

鉴于copy字典速度很快,因为它是一个浅层不可变副本,通常返回副本比返回对可变版本的引用要好得多.如果您发现您的代码正在敲击创建副本的方法,那么在您的对象中缓存一个不可变副本并将其转发,并在可变后备存储发生更改时使其无效.