2012-02-04 27 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