2010-08-09 5 views
2

내 앱을 포장하기 만하면되므로 앱에서 누출을 식별하는 악기를 실행하는 단계에 넘어갑니다. 나는 그것이 누수로 등록되는 이유를 알아낼 수없는 누출을 발견하게된다.메모리 누수가 발생하는 Iphone 하위 문자열

나는 다음과 같은 예를 들어 라인이 : 그래서 기본적으로 모든 메신저가 "loopstring"단지의 후행 보풀을 차단보다에 imagetype 문자열로 그 퍼팅의 섹션을 당기고하고

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

을 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

답변

1
:

감사

다음은 리팩토링 코드

눈에 띄지 않습니다. 그런데 왜

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

효과적으로 절반의 메모리 사용과

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

와 같은를 얻는 경우에?

+0

죄송합니다 이것이 내 첫 번째 앱 이었으므로 아직 해킹 된 코드가 남아 있습니다. 그러나 그것이 누출되어야하는 이유를 설명하지는 않습니다. – Trevor

+0

또한 두 번째 줄은 다음과 같아야합니다. imageType = [imageType substringFromIndex : [imageType rangeOfString : @ ""] .location + @ "".length]; – Trevor

+0

당신은 도구가 실수 일 수있는 도구라는 것을 알아야합니다. 코드를 깨끗하고 깔끔하게 유지하면 예방할 수 있습니다.'@ "".length'를'7'로 변경해보십시오. 이 줄 주변에 다른 해키 코드가 없다는 것이 확실합니까? – mvds

1

누수 된 메모리가 누출 된 메모리가 인 경우으로 알려줍니다. 주위를 클릭하면 (메모리 주소 옆에 오른쪽 화살표 아이콘이 있다고 생각합니다) 그 주소에 대한 모든 할당/유지/릴리스를 볼 수 있습니다. 무엇

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

또는 어딘가에 여분의 시간이 남아있을 수도 있습니다. 또는 오브젝트가 Top10 이미지에서 액세스되어 어딘가에 여분의 시간을 남겼습니다. 그러나 누수의 원인은 제공된 코드의 범위를 벗어날 것입니다. –

관련 문제