2012-06-07 75 views
0

我發現這個代碼返回可變其中返回值應該是不可變的

-(NSString *) genRandStringLength: (int) len { 

    NSMutableString *randomString = [NSMutableString stringWithCapacity: len]; 

    for (int i=0; i<len; i++) { 
     [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]]; 
    } 

    return randomString; 
} 

是它確定傳遞一個可變對象,其中,所述結果是不可變的?

我們應該怎麼做?

return [randomString copy]; 

return randomString; 

回答

4

從技術上講,它是返回一個NSMutableString而不是NSString沒有問題。由於前者是後者的子類,因此NSMutableString實例支持NSString所做的一切。例如,如果你看看Cocoa,你會注意到,很多alloc/init方法返回你想創建的類的子類的一個實例。

在你的特殊情況下,如果方法返回一個可變字符串,我看不出什麼問題,因爲該字符串是在該方法中本地創建的,並且未在該類的其他位置使用。

通常,如果這些對象是返回它們的類的ivars /屬性,則應該避免返回可變對象。如果你做了這樣的事情,方法的調用者可以發現返回的對象是可變的,然後改變其內容,而不通知對象的「擁有」實例關於變化。

另外請注意,如果你想返回一個不可變的對象,return [randomString copy];只在ARC和垃圾收集下是正確的。對於手動內存管理,它應該是return [[randomString copy] autorelease];return [NSString stringWithString:randomString];

0

你可以這樣做: -

-(NSString *) genRandStringLength: (int) len 
{ 
    NSMutableString *randomString = [NSMutableString stringWithCapacity: len]; 

    for (int i=0; i<len; i++) { 
    [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]]; 
    } 

    NSString *immutableString = [NSString stringWithString:randomString]; 

    //OR 

    NSString *immutableString = (NSString *)randomString; 

    return immutableString; 
}