2010-08-09 38 views
2

我只是包裝了我的應用程序,所以即時通訊到運行儀器的舞臺上以識別應用程序中的泄漏。我遇到了泄漏,我無法弄清楚爲什麼它被註冊爲泄漏。Iphone子串導致內存泄漏

我有例如以下行:

NSString *imageType = [[[NSString alloc] initWithString:[loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]] autorelease]; 
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length]; 

所以基本上所有IM做的是拉出「loopstring」,並把該進IMAGETYPE串不僅僅是切斷的尾部的絨毛部分字符串使用SubstringFromIndex方法。

當我運行儀器時它說「NSCFString substringwithRange」泄漏。它突出了下聯:

imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length]; 

我會認爲substringFromIndex方法應該返回自動添加到自動釋放池的字符串。

任何想法哪裏會出錯?

感謝

以下是重構代碼:

- (void)SetupTop10:(NSString *)Top10Data 
{ 
while (Top10Data != @"") { 
    NSLog(Top10Data); 
    if ([Top10Data rangeOfString:@"</TOP10ENTRY>"].location == NSNotFound){ 
     Top10Data = @""; 
    } 
    else 
    { 

     NSString *loopString = [Top10Data substringToIndex:[Top10Data rangeOfString:@"</TOP10ENTRY>"].location + 13]; 
     Top10Data = [Top10Data stringByReplacingOccurrencesOfString:loopString withString:@""]; 

     //NOW CREATE A RECORD FOR THIS ITEM 
     NSString *imageType = [loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]; 
     imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + 7]; 
     NSString *displayText = [loopString substringToIndex:[loopString rangeOfString:@"</DISPLAYTEXT>"].location]; 
     displayText = [displayText substringFromIndex:[displayText rangeOfString:@"<DISPLAYTEXT>"].location + 13]; 
     NSString *link = [loopString substringToIndex:[loopString rangeOfString:@"</INTERESTID>"].location]; 
     link = [link substringFromIndex:[link rangeOfString:@"<INTERESTID>"].location + 12]; 
     [Top10Images addObject:imageType]; 
     [Top10Links addObject:link]; 
     [Top10s addObject:displayText]; 
     Top10RowCount = Top10RowCount + 1; 
    } 
} 

[self.Top10Table reloadData]; 
Top10Table.hidden = NO; 
loadingLabel.hidden = YES; 
loadingIndicator.hidden = YES; 

}

// ******************

+0

因爲你可能會改變''Top10Data'參數的副本,不是一個好主意嗎? – Rengers 2010-08-11 18:21:46

回答

1

它看起來不漏。但是,爲什麼

NSString *imageType = [[[NSString alloc] initWithString: 
      [loopString substringToIndex:[loopString 
              rangeOfString:@"</IMAGE>"].location] 
     ] autorelease]; 

,如果你得到有效使用

NSString *imageType = [loopString substringToIndex:[loopString 
              rangeOfString:@"</IMAGE>"].location]; 

相同一半的內存使用情況?

+0

對不起,這是我的第一個應用程序,所以還有一點hacky代碼。 但這並不能解釋它應該泄漏的原因。 – Trevor 2010-08-09 23:15:25

+0

第二行應該是: imageType = [imageType substringFromIndex:[imageType rangeOfString:@「」] .location + @「」.length]; – Trevor 2010-08-09 23:18:13

+0

你必須認識到,儀器也只是一個工具,可以犯錯誤。保持代碼清潔和整齊有助於防止它們。嘗試將「@」「.length」更改爲「7」。你確定這些線沒有其他的黑客代碼嗎? – mvds 2010-08-09 23:29:38

1

泄漏會告訴你泄漏內存的位置是分配的。如果點擊(我認爲內存地址有一個右箭頭圖標),那麼您可以查看該地址的所有分配/保留/版本。

在這個例子中,泄漏將指向你到第一線,當它(泄漏實際上它在dealloc中缺少釋放/上分配)的五分之一是「漏」:

NSString * s = [someString substringFromIndex:1]; 
[myArray addObject:s]; 
// ... 
NSString * s2 = [myArray lastObject]; 
instanceVariable = [s2 retain]; 
// ... and forget to release in dealloc 

是什麼tableView:cellForRowAtIndexPath:做?

1

我在上面的代碼中看不到任何問題。你在你的dealloc方法中發佈了Top10Images嗎?

+0

或者可能在某個地方保留了額外的時間。或者,也許該對象被訪問了Top10Images,並保留了一些額外的時間。但泄漏的原因將在所提供的代碼之外。 – 2010-08-20 19:20:35