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而不是NSDictionary

我應該用return [this copy];將它轉換成NSDictionary嗎?

回答

5

這取決於。

Sergio的答案是正確的,保存爲一個非常重要的問題:

當你的對象包含可變變異字典詞典另一個對象檢索後會發生什麼?除非其他對象是專門爲支持字典可能發生變化的潛力而編寫的,否則另一個對象現在將處於不一致的狀態。

由於copy對字典很快,因爲它是一個不可變的淺拷貝,所以通常返回一個副本比返回對可變版本的引用要好得多。如果你發現你的代碼正在衝擊複製的方法,那麼在你的對象中緩存一個不可變的副本,並在每次可變後備存儲更改時使其失效。

2

我不認爲這是不好的做法。這樣做的最終效果是您的NSDictionary的接收器不會嘗試修改對象(儘管該對象是可變的)。這是非常安全的,因爲你的消費方法更一般化(它可以同時適用於可變對象和不可變對象)。

0

以這種方式返回一個不可變對象不是確實是不好的做法,因爲NSMutableDictionaryNSDictionary的子類。這是多態性,所以它是'一切都好'。

但我可能會返回一個自動釋放的複製像這樣反正:

return [NSDictionary dictionaryWithDictionary:this]; 
+0

我使用ARC反正... – Tyilo

相關問題