2011-03-22 19 views
0
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict{ 

    //currentElenet is NSString 
    currentElement = [elementName copy]; 

    if ([elementName isEqualToString:@"struct"]) {  

     self.post = [[Question alloc] init]; 

    } 
} 

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

    if ([currentElement isEqualToString:@"string"]) { 
     post.text = [NSString stringWithFormat:@"%@ %@", post.text, string]; 
    } 
} 

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

    if ([elementName isEqualToString:@"struct"]) { 

     [conversations addObject:post]; 
     [post release]; 
     post = nil; 
    } 
} 

//Question.m file 
@synthesize text 

-(id)init{ 

    self = [super init]; 
    if (self == nil) { 

    } 
    else { 
      //declared as retain in .h file 
     text = [[NSString alloc]initWithString:@""]; 
    } 
    return self; 
} 

-(void)dealloc{ 
    [super dealloc]; 
    [title release]; 
} 

ここでメモリが漏れていますか?私はNSXMLデリゲートメソッドを呼び出し、それは基本的にNSMutableArrayに "Question"のインスタンスを置きます。私は楽器をチェックし、それを解析中にメモリリークがあります。しかし、私は、なぜ...目的C、メモリリーク?

答えて

2

currentElement = [elementName copy];

が表示されていないドキュメントのcopy APIの説明をお読みください。そこには、あなたは本当にためにあなたのプロパティ宣言を含める必要があり、コードの残りの部分は正しい

0

currentElementは---あなたの解析フローでリリース取得されていないことを述べています人(プロパティはメモリが管理されている方法を定義するため)保証人とメモリ管理の質問に答えるために、しかし、すべてのretainのプロパティと仮定:

  • currentElementを決して

  • textを解放するppearsは

  • self.postをリリースしていないことを決して思わ[[Question alloc] init]の結果が割り当てられます。そのメソッドの結果は、すでにあなた自身のオブジェクトであり、postセッターはそれを再び保持します。

    id question = [[Question alloc] init]; 
    self.post = question; 
    [question release]; 
    

    (またdeallocにリリースされなければならないか、あなたがそれで終わったらセッターのバランスを取るために)

:それはの線に沿って、メソッドが終了する前に解放されなければなりません
1

に見える...

this method retains the new object before returning it. The invoker of the method, however, is responsible for releasing the returned object.