2011-07-14 9 views
1

xmlファイルを解析しようとしています。私は辞書の配列を作成していますし、これらの作成された配列で配列を作成しています。 nsdictionaryを配列にコピーしているときにメモリリークが発生しています。誰でも助けてください! おかげtInState、tInStateはnsmutabあるここデータの解析時にメモリリークが発生する

enter image description here

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 

if(parseMode == 1){ 
    //  NSLog(@"found this start tag: %@", elementName); 
    if ([elementName isEqualToString:@"Group"]) { 
     [tInState removeAllObjects]; 
    } 
    else if ([elementName isEqualToString:@"State_Name"]) { 
     tData = [[NSMutableDictionary alloc] init]; 
     xmlItem = 0; 
    } 
    else if ([elementName isEqualToString:@"T_Name"]) { 
     xmlItem = 1; 
    } 
    else if ([elementName isEqualToString:@"T_Address"]) { 
     xmlItem = 2; 
    } 
    else if ([elementName isEqualToString:@"T_Ph"]) { 
     xmlItem = 3; 
    } 
} 

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  

if (parseMode == 1) { 
    // NSLog(@"found this end tag: %@", elementName); 
    if([elementName isEqualToString:@"T_Info"]) {    
     [tInState addObject:[tData copy]]; 
     [tData autorelease]; 
    } 
    else if ([elementName isEqualToString:@"Group"]) { 
     [tlist addObject:tInState]; 

    }      
} 

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 

if (parseMode == 0) { 
    [self addToStateList:string]; 
} 
else if (parseMode == 1) { 
    //  NSLog(@"found this character: %@", string); 
    switch (xmlItem) { 
     case 0:    
      [tData setValue:string forKey:@"State_Name"]; 
      break; 
     case 1:    
      [tData setValue:string forKey:@"T_Name"]; 
      break; 
     case 2:    
      [tData setValue:string forKey:@"T_Address"]; 
      break; 
     case 3:    
      [tData setValue:string forKey:@"T_Ph"]; 
      break; 
     default: 
      break; 
    }   
} 

}

私はviewdidload関数で割り当て、releaseMemoryで解放した私はNScopyの文書を調べて、コピーを使用すると所有権が移転されると言います。私はすべての配列を解放しているので、なぜそれでも問題を引き起こしているのですか?

助けてください。 ありがとう

+0

私はdidndelementの行をクリアしませんでした。私はnsdictionary(tdata)を公開していません。私はちょうどクラッシュをリリースする場合。 – pa12

+0

コードを貼り付けて、スクリーンショット(読みにくい)を取り除いてください。 –

+0

ARCに変換することを検討してください。これらの種類の問題は消えます。 – Cthutu

答えて

0

オンラインでは、tDataのコピーを作成していますが、それをリリースして漏れていません。 addObjectコールでコピーを作成する代わりに、それを変数に割り当ててからaddObjectに渡してから解放します。

id temp = [tData copy]; 
[tInState addObject:temp]; 
[temp release]; 

また、私は[tData autorelease]が実際にコピーを解放することを意図していることを想定しています。もしそうなら、それは必要ではない。

+2

あるいは '[[tData copy] autorelease]'を使ってください。それも動作します。 ;) –

+0

@ジョナサン - あなたがもうそれを必要としないことを知っていれば、確かに、オートリリースプールに入れておくのはそれほど重要ではありません。 – highlycaffeinated

+1

ええ、それはより短く、よりクリーンなコードで、一時的な作成をスキップできます。 '-autorelease'のオーバヘッドは非常に低く、早すぎる最適化を避けることができます。 –

1

あなたのリークの理由は、tDataがあなたの言うことをやっているからコピーを返すからです。次の行でtDataのautoreleaseを呼び出すと、元のtDataが自動リリースされ、その結果、オーバーリリースされます。その行を[tInState addObject:[[tData copy] autorelease]];に変更し、次の行で自動解放呼び出しを削除する必要があります。

関連する問題