2011-02-14 71 views
0

嗨我有一個簡單的函數,基本上返回一個輸入字符串的修剪版本。問題是當我運行儀器&檢查泄漏時,此功能顯示100%泄漏,具體在stringWithString行上。stringWithString泄漏內存

任何人都可以請指導我我在做什麼錯在這裏。

+ (NSString *) trim:(NSString *)string 
{ 
    if (string == nil) 
     return nil; 
    NSString *str = [NSString stringWithString:string]; 
    str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

    //[[NSString stringWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]] autorelease]; 
    return str; 
} 
+0

你保留返回的字符串,因爲沒有我不保留它這個字符串被標記爲自動釋放 – kgutteridge 2011-02-14 08:53:55

+0

。 – 2011-02-14 09:01:46

回答

2

首先,這看起來絕對沒什麼問題,你確定泄漏是stringWithString:

然後,你不需要也無妨。你可以簡單地做:

+ (NSString *) trim:(NSString *)string 
{ 
    if (string == nil) 
     return nil; 

    return [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 
2

我能想到的唯一原因是,如果你運行從沒有一個NSAutoReleasePool一個產卵線程的代碼,因爲[NSString stringWithString:string];有發送給它的autorelease消息。

+0

`-stringWithString:`不一定發送autorelease。如果這個參數不是一個NSMutableString,你可能會返回相同的字符串。 – JeremyP 2011-02-14 09:06:03

3

如果這個代碼在一個線程中運行,請確保您有一個autoreleasepool成立。 stringWithString返回一個自動釋放對象,並且只有當你的線程有一個autoreleasepool時纔會發生。