2012-04-26 2 views
0
if ([elementName isEqualToString:@"type"]) 
    { 
     items  = [[NSMutableDictionary alloc] init]; 
     currentname = [[NSMutableString alloc] init]; 
     currentid = [[NSMutableString alloc] init]; 
    } 

あなたはこれらのアイバーズに保存された前回の値を漏洩問題ここに漏れはどこですか? RESOLVができる方法

+2

XCodeのスタティックアナライザーを試してみましたか?症状は何ですか?楽器を使ってみましたか? – Romain

+0

あなたはおそらくより多くの文脈を提供して意味のある回答を得る必要があります。これらのiVarはクラスにありますか、メソッド/関数に対するこれらのローカル変数ですか?後で何をしますか? – FelixLam

答えて

2
currentElement = [elementName copy]; 
items   = [[NSMutableDictionary alloc] init]; 
currentname = [[NSMutableString alloc] init]; 
currentid  = [[NSMutableString alloc] init]; 

リークが発生します。

+0

はい私は新しい値のすべてのクリップを行います。なぜxmlデータファイルから古いバリューを破棄したのですか? –

+0

@ B.Moahmmed.Amine古い値については、あなたは作成してからリリースしてください。 – Hailei

0

このスニペットにリークがあることが分かっている場合は、NSStringオブジェクト "elementName"が漏れていることを伝えているInstrumentを既に実行していると仮定します。

ロマンが正しいです.Xcodeスタティックアナライザーを実行するのがよいステップです。 [elementName copy]は保持カウント+1のオブジェクトを返します。 (ココアの規約に従い、すべての "コピー"セレクタは返されたオブジェクトの所有権をコードに転送します)。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    [currentElement release]; 
    currentElement = [elementName copy]; 

    // your method body here… 
} 
+0

私はwrite [currentElement release]を持っています。同じ問題です。私はここに私の問題を考える - (無効)parseXMLFileAtURL:(NSStringの*)URL { \t donnesの= [[NSMutableArrayののalloca]のinit]; \t XMLURL = [NSURL URLWithString:URL]。 \tのXMLParser = [NSXMLParserのalloca] initWithContentsOfURL:XMLURL]。 \t【のXMLParser setDelegate:自己]。 \t【のXMLParser setShouldProcessNamespaces:NO]。 \t【のXMLParser setShouldReportNamespacePrefixes:NO]。 \t [xmlparser setShouldResolveExternalEntities:NO]; \t [xmlparser parse]; \t} –

1
  • currentElement = [elementName copy];
  • items = [[NSMutableDictionary alloc] init];
  • currentname = [[NSMutableString alloc] init];
  • は、だからここソリューションは、あなたが使用して、それを必要としない時にコピーされたオブジェクトを解放することによって、 "コピー" コールのバランスを取ることです

  • currentid = [[NSMutableString alloc] init];

parser:didStartElement:namespaceURI:qualifiedName:attributes:メソッドが複数回実行されると、これらのすべてがメモリリークを引き起こします。

この問題を解決する簡単な方法は、変数をプロパティに変更することです。たとえば、あなたのヘッダファイル、変化:

@interface SomeClass { 
    NSMutableDictionary *items; 
} 

へ:

@interface SomeClass { 
} 

@property (retain) NSMutableDictionary *items; 

そして@implementation SomeClass後にこれを追加します。

self.items = [[[NSMutableDictionary alloc] init] autorelease]; 

@synthesize items; 

をその後に元のコードを変更

Bメモリの問題をチェックしたいときは、XcodeとInstrumentsの "Analyze"機能があなたの友人です。