2012-02-04 36 views
0

我有這樣的方法:潛在的內存泄漏,沒有意義

-(NSString *)scrambleWordGenerator: (NSUInteger)length { 
    NSMutableString *scrambledWord = [[NSMutableString alloc] initWithString:@""]; 
    for (int i = 0; i < length; i++) { 
     NSUInteger randomIndex = arc4random() % [self.arrayOfCharacters count]; 
     NSString *randomCharacter = [NSString stringWithString:[self.arrayOfCharacters objectAtIndex:randomIndex]]; 
     [scrambledWord insertString:randomCharacter atIndex:i]; 
    } 
    NSString *finalWord = [[NSString alloc] initWithString:scrambledWord]; 
    [scrambledWord release]; 
    return finalWord; 
} 

它的工作原理,順順當當其實,然而在使用Xcode的「分析」功能,它說,finalWord有潛力內存泄漏。

我想在創建NSString時使用的預製方式是字符串將被自動釋放。我錯過了什麼?下面是錯誤的屏幕抓取:

enter image description here

編輯

的方法現在看起來是這樣的:

-(NSString *)scrambleWordGenerator: (NSUInteger)length { 
    NSMutableString *scrambledWord = [[NSMutableString alloc] initWithString:@""]; 
    for (int i = 0; i < length; i++) { 
     NSUInteger randomIndex = arc4random() % [self.arrayOfCharacters count]; 
     NSString *randomCharacter = [NSString stringWithString:[self.arrayOfCharacters objectAtIndex:randomIndex]]; 
     [scrambledWord insertString:randomCharacter atIndex:i]; 
    } 
    NSString *finalWord = [NSString stringWithString:scrambledWord]; 
    [scrambledWord release]; 
    return finalWord; 
} 

而且沒有更多的錯誤!

回答

3

不,你使用alloc的那一刻,你是負責釋放它 - 無論是release或移動它通過autorelease自動釋放池。

這將是對自動釋放池,如果你使用[NSString stringWithString:]代替。

+1

提示:你可以用'回替換最後一行[finalWord自動釋放]' – Costique 2012-02-04 19:26:59

+0

你倆是驚人的,太感謝你了!我用Simon的建議,但Costique,我會考慮其他方法! – Max 2012-02-04 19:44:40

+1

@LumBerry:顯式'autorelease'在'return'語句可以爲未來的可讀性很有幫助,尤其是在一個較長的方法。另一方面,您必須確保在最初寫入時不要將'autorelease'發送給無主對象。 – 2012-02-04 20:11:52