2011-09-16 2 views
2
라인에서

100.0 % 표시가 보라색에서 내 응용 프로그램은 잘 작동하지만, 내가 누출을 확인하기 위해 악기를 실행할 때, 그것은 나에게 코드 줄에서 누출을 보여줍니다메모리 누수 코드

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

여기이 줄을 포함하는 방법이다 :

-(NSString*) languageSelectedStringForKey:(NSString*) key 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"zh" ofType:@"lproj"]; 

    if(selectedLanguage==French) 
    { 
     FinalString = [[NSString alloc] initWithFormat:@"http://www.xyz.com/api_com.php?page_id=%d",IDValue]; 
     url = [[NSURL alloc] initWithString:FinalString]; 
    } 
    else if(selectedLanguage==German) 
    { 
     FinalString = [[NSString alloc] initWithFormat:@"http://www.x.com/api_com.php?page_id=%d",IDValue]; 
     url = [[NSURL alloc] initWithString:FinalString]; 
    } 
    else if(selectedLanguage==Nepali) 
    { 
     FinalString = [[NSString alloc] initWithFormat:@"http://www.xy.com/api_com.php?page_id=%d",IDValue]; 
     url = [[NSURL alloc] initWithString:FinalString]; 
    } 
    xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [url release]; 

    //Initialize the delegate. 
    parser = [[NewsParser alloc] initXMLParser]; 
    //Set delegate 
    [xmlParser setDelegate:parser]; 

    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 
    if(success) 
     NSLog(@"No Errors"); 
    else 
     NSLog(@"Error Error Error!!!"); 

    NSBundle* languageBundle = [NSBundle bundleWithPath:path]; 
    NSString* str=[languageBundle localizedStringForKey:key value:@"" table:nil]; 
    return str; 
} 

여기 languageSelectedStringForKey가 호출되는 내 ViewDidLoad 방법입니다.

- (void)viewDidLoad 
{ 
    // Do any additional setup after loading the view from its nib. 
    appDelegate = (ProgAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    IDValue = 1; 
    textLabel.text=[self languageSelectedStringForKey:@"Welcome to Advance Localization"]; 
    [super viewDidLoad]; 
} 

이 누출의 원인은 무엇이며 어떻게 해결할 수 있습니까?

이 인의 dealloc 방법 : -

- (void)dealloc 
{ 

    [xmlParser release]; 
    [parser release]; 
    [nibLoadedCell release]; 

    [super dealloc]; 
} 
+0

iOS 6가 장착 된 기기에서 누출 프로파일 링이 있습니까? 비슷한 누출이 있었고 iOS 5가있는 장치에서 프로파일 링을하면 누출이 사라집니다. 그래서 애플의 소스 코드에서 문제를 지적 할 수 있을까? – iMathieuB

답변

3

혹시

[xmlParser release]; 

를 호출합니까?

그렇지 않은 경우 더 이상 필요하지 않을 때 해제해야합니다. 아마도 같은 클래스의 dealloc 메서드에서 해당 줄이 나타납니다.

+0

sory 매튜 내 불완전한 정보에 대한 내 dealloc 메서드에서 체크 xmlParser 이미 내 dealloc 메서드를 확인할 수 있습니다. 실제로 내 정보를 업데이트 할 수 있습니다 ... 감사 ... – user768373

+0

같은 누수가 발생했습니다 ... 내 문제가 해결되지 않음 ... – user768373

0

NewsParser 파서에 인스턴스 변수를 만들어서 dealloc에서 해제해야합니다. 위, 당신은 그것을 초기화하지만 그것을 풀어주지는 않습니다. 물론 xmlParser의 위임자이기 때문에 할 수 없습니다. 따라서 객체가 유지되고 제대로 릴리즈되도록하려면 ivar이어야합니다.

+0

이것은 인스턴스 변수 ('parser'라고합니다)이며'dealloc' 메소드에서 해제되었습니다. – deanWombourne

+0

그게 바로 두 가지 일에서 오는 것입니다! 바로 그때, 내 생각 엔 xmlParser가 코드의 다른 곳에서 init''d 될 것입니다. 예를 들어, languageSelectedStringForKey 메서드가 두 번 호출되면 xmlParser에 대한 기존 참조가 유출됩니다. "init"를 다시하기 전에 non-nil을 검사하지 않는 "파서"와 같은 다른 객체도 마찬가지입니다. –

+0

나는 방금 같은 생각을 가지고 있었다 :) 나의 대답에 대한 편집을 보라! – deanWombourne

0

당신은 당신이 생각 한

이이 파서 :) 또한


에 의해 개최되는 URL에서 개최된다 (적어도 당신이 게시 코드) FinalString를 절대 공개하지 무엇을 이 함수가 두 번 호출되면 일어날 것입니까? 당신이 인스턴스 변수에 할당하는 경우

[xmlParser release]; 
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
즉 이전 객체를 해제 기억해야

)

은 때마다 당신은

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

가 이전 XmlParser가 누출 것이라고 말한다

+0

나는 [FinalString release]를했지만 같은 누수가 발생했습니다 ... – user768373

+0

제 편집 참조 - 다른 생각이 들었습니다. :)이 함수를 두 번 호출하면 어떻게됩니까? – deanWombourne