EXC_BAD_ACCESS с NSXMLParser - PullRequest
       20

EXC_BAD_ACCESS с NSXMLParser

0 голосов
/ 23 августа 2011

Я получаю EXC_BAD_ACCESS при синтаксическом анализе XML-файла в приложении Xcode4 для iPhone

Хотя я прочитал много подобных вопросов об ошибках здесь, но не мог понять, как исправить мой код!

Сбой при [парсере]

Затем я включил NSZombieEnabled и получил следующую ошибку:

*** -[CFString appendString:]: message sent to deallocated instance 0x588c3a0

Ниже приведен мой код, связанный с разделом синтаксического анализа:

-(void)openXML {
    NSURL *url = [NSURL URLWithString:@"http://localhost/news.xml"];    
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    [con release];
}

-(void)parseXMLData:(NSData *)xmlData{
    parser = [[NSXMLParser alloc] initWithData:xmlData];
    parser.delegate = self;
    [parser parse];
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{    
    xmlDocument = [[NSMutableData alloc] init];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [xmlDocument appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    [self parseXMLData:xmlDocument];
}

- (void)parserDidStartDocument:(NSXMLParser *)parser{
    [offersData removeAllObjects];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    completeString = [[NSMutableString alloc] init];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    [offersData addObject:completeString];
    [completeString release];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [completeString appendString:string];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{
    [offersTableView reloadData];
}

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Сообщение означает, что код пытается вызвать метод для строкового объекта (т.е. это не ноль), но объект был освобожден (освобожден).

В didEndElement вы освобождаете completeString но не устанавливая его на nil.Это делает возможной ошибку.

Вероятно, что происходит после того, как didEndElement, foundCharacters будет вызван до a didStartElement (возможно, есть какой-то пробел, как новыймежду тегами), поэтому completeString по-прежнему освобождается, что приводит к сбою.

После выполнения [completeString release]; также установите для него значение nil, чтобы любые вызовы метода, которые могут быть выполнены с ним до его повторного вызова,выделено не будет сбой.

Тогда было бы неплохо сделать addObject только если completeString не равен nil (что может произойти в зависимости от того, как вложены теги xml).

Так что попробуйтеизменение didEndElement на:

if (completeString != nil) {
    [offersData addObject:completeString];
}
[completeString release];
completeString = nil;
0 голосов
/ 23 августа 2011

если вы синтезировали completeString, то вам нужно вызвать себя с точкой, чтобы сохранить

изменить это

  completeString = [[NSMutableString alloc] init];

на

 self.completeString = [[NSMutableString alloc] init];
...