Цель C, утечка памяти? - PullRequest
0 голосов
/ 22 марта 2011
- (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, и он в основном помещает экземпляр «Question» в NSMutableArray.Я проверил прибор, и во время его анализа произошла утечка памяти.Но я не понимаю, почему ...

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

currentElement = [elementName copy];

Пожалуйста, прочитайте описание API copy в документации. Там упоминается, что

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

1 голос
/ 22 марта 2011

Вам действительно нужно включить объявления свойств, чтобы люди могли с уверенностью ответить на вопрос об управлении памятью (поскольку свойства определяют, как управляется память), но при условии, что все свойства retain:

  • currentElement никогда не будет выпущено

  • text, кажется, никогда не будет выпущен

  • self.post присваивается результат [[Question alloc] init]. Результатом этого метода уже является ваш собственный объект, и установщик post снова его сохраняет. Он должен быть освобожден до выхода из метода, в соответствии с:

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

    (Он также должен быть выпущен в dealloc или когда вы закончите с ним для балансировки установщика)

0 голосов
/ 22 марта 2011

currentElement --- не освобождается в вашем процессе синтаксического анализа ... остальная часть кода выглядит правильно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...