2011-09-16 9 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のデバイスでプロファイリングするとリークが消えます。だから、Appleのソースコードの問題を指摘することができますか? – iMathieuB

答えて

3

は、あなたがこれまで

[xmlParser release]; 

を呼ぶのですか?

そうでない場合は、不要になったら解放する必要があります。おそらく、その行が現れる同じクラスのdeallocメソッドにあります。

+0

sory私の不完全な情報のMatthew私は既にdeallocメソッドでxmlParserを公開しています。私のdeallocメソッドでチェックすることができます。私は実際に上記の情報を更新できます...ありがとう... – user768373

+0

同じリークが発生しました...問題は解決していません... – user768373

0

NewsParserパーサにインスタンス変数を作成し、それをdeallocで解放する必要があります。上に、あなたはそれを始めるが、あなたはそれを解放しない。もちろん、それはxmlParserの代理人なのでできません。したがって、オブジェクトが保持されていることを確認するためには、適切に解放されて、ivarでなければなりません。

+0

これはインスタンス変数( 'parser'と呼ばれます)で、' dealloc'メソッドで解放されています。 – deanWombourne

+0

これは、一度に2つのことをすることから来ています!そうですね、私の推測では、xmlParserはあなたのコードのどこかにinitされているはずです。たとえば、languageSelectedStringForKeyメソッドが2回呼び出された場合、xmlParserへの既存の参照はリークされます。 "init"を再実行する前にnon-nilをチェックしていない "parser"などのオブジェクトも同様です。 –

+0

私はちょうど同じ考えを持っていた:)私の答えの編集を参照してください! – deanWombourne

0

はあなたが考えた、

これはパーサ:)また


によって保持されているURLに保持されている(少なくともないあなたが投稿したコードで)FinalStringを解放したことがないものをこの関数が2回呼び出されると起こりますか?

あなたは

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

を言うたびに、前のXMLPARSERをリークします;)

あなたはインスタンス変数に割り当てている場合は、

[xmlParser release]; 
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
すなわち前のオブジェクトを解放するために覚えています
+0

私はこの[FinalString release]を行っていますが、同じリークが発生しています... – user768373

+0

私の編集を見る - 私は別のアイデアを持っていました:)この関数を2回呼び出すとどうなりますか? – deanWombourne

関連する問題