2012-01-03 8 views
0

私はコードの詳細を提供しました。 checkstatusthread()は、5秒ごとに呼び出されます。 ipItemsArray以下に使用されるオブジェクトは、サーバーからのXMLを格納します。NSMutableArrayを使用したもう1つのメモリリーク

// XMLAppDelegate.h

@interface XMLAppDelegate : NSObject <UIApplicationDelegate> { 
    NSMutableString *hostStr2; 
    NSData *dataURL2; 
    NSString *playlistdata; 

} 

@property (nonatomic, retain) NSMutableString *hostStr2; 
@property (nonatomic, retain) NSData *dataURL2; 
@property (nonatomic, retain) NSString *playlistdata; 
@end 

// XMLAppDelegate.m

-(void)checkstatusthread 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://%@/getplaylist.php?ip=%@",yourip,restip]; 

    dataURL2 = [NSData dataWithContentsOfURL: [ NSURL URLWithString: hostStr2 ]]; 

    playlistdata = [[NSString alloc] initWithData:dataURL2 encoding: NSASCIIStringEncoding]; 

    ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"]; 

    [hostStr2 release]; 
    [playlistdata release]; 

    status =[ipItemsArray objectAtIndex:0]; 
    [status retain]; 

    if([[ipItemsArray objectAtIndex:0]isEqualToString:@"0001"]) 
    { 
     serverOutput1 =[ipItemsArray objectAtIndex:1]; 
     [serverOutput1 retain]; 

     nowplaying =[ipItemsArray objectAtIndex:2];  
     [nowplaying retain]; 

     tracklocation=[ipItemsArray objectAtIndex:3]; 
     [requestlocation retain]; 

     requestlocation=[ipItemsArray objectAtIndex:4]; 
     temp_app =[tracklocation intValue]; 


    } 

     [serverOutput1 retain]; 
     [nowplaying retain]; 
     [serverOutput1 retain]; 
     [nowplaying retain]; 
     [tracklocation retain]; 
     [requestlocation retain]; 

     // checkstatus() called 
     [self performSelectorOnMainThread:@selector(checkstatus) 
          withObject:nil 
         waitUntilDone:false]; 

    [pool drain]; 
} 


- (void)dealloc { 
    [dataURL2 release]; 
    [playlistdata release]; 
    [ipItemsArray release]; 
} 

NSArray *ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"];は私に私はXcodeの4.2の漏れの楽器を実行するメモリリークを与えるライン。これに関するすべての可能なことを試しましたが、何かを追加する必要があるように感じます。誰かが私を助けてくれますか?

漏洩したオブジェクトのスクリーンショットです。また、私は私のアプリがDeallocメソッドを呼び出さないことに気づいた。

enter image description here

+1

完了したらplaylistdataとhostStr2をリリースしていますか? –

+0

@ShantiK:そうです。 – maddy2012

+0

なぜあなたはステータスを2度保持していますか? –

答えて

1

リークしているオブジェクトは「ステータス」です。私はそれがiVarだと推測します。

これらの行が2回実行されると、以前に格納された状態の値が適切に解放されず、リークが発生します。理想的には、次のようにしてください。

if(status) { 
    [status release]; 
} 
status =[ipItemsArray objectAtIndex:0]; 
[status retain]; 

これは、計測器に表示される漏れを解決します。 (ARCが使用されていないと仮定します)

+0

他のiVarsでも同じことが必要です。そうでなければ、プロパティを保持し、self.statusなどを使用してプロパティにアクセスします。その場合は、前の値を直接割り当てる必要はありません。 –

0

あなたが行っているすべてが正しいです。 Leaks Instrumentに示されている漏れのすべてが現在リークであるとは限りません。

最初にClang Analyzer XCode - > Products - > Analyzeを使用することをお勧めします。これはいくつかの潜在的な漏れを示しています。あなたが割り当てられ、まだリリースされていない

NSMutableString *hostStr2 = [[NSMutableString alloc] initWithFormat:@"http:// %@/getplaylist.php?ip=%@",yourip,restip]; 

:そして、この後、あなたは実際にAnalyzerはこのコード行にあなたを指しているHeapshot分析http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

ありがとう。 Analyzeは私に問題がないことを示します。私はここに与えられたリンクを試し、この方法を使用して戻ってくるでしょう。 – maddy2012

+0

割り当てツールを使用すると、マークヒープ解析がコードのこの行に再びポイントします。 NSArray * ipItemsArray = [プレイリストデータcomponentsSeparatedByString:@ "|^|"]; ' – maddy2012

1

を使用する必要があります。

あなたはそれを解放する必要があります。

+0

プレイリストデータも公開されていません。 – WiseOldDuck

+0

'playlistdata'はクラスレベルでしたので、私はそれを指摘していません。 –

+0

私は3つのオブジェクトをすべて解放しています。しかし、まだそれはメモリリークを示しています。他のクラスやその他のソリューションを使用する必要がありますか? – maddy2012

関連する問題