2009-06-23 1 views
1

나는 this tutorial을 따라 갔으며 구문 분석 부분은 정상적으로 작동합니다. 내 문제는 개체에 저장하는 값을 출력 할 때 (내 경우 개체가 자동차 인 경우) 항상 null로 유지된다는 것입니다. 모든 객체를 NSMutableArray에 저장합니다. NSMutableArray는 항상 길이/개수 == 0 인 것처럼 보입니다 ... 내가 뭘 잘못하고 있니? 배열은XMLParser 및 NSMutableArray

- (XMLParser *) initXMLParser { 
    [super init]; 
    appDelegate = (Car2GoAppDelegate *) [[UIApplication sharedApplication]delegate]; 
    currentElementValue = [[NSMutableString alloc]init]; 
    return self; 
} 


- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attribute:(NSDictionary *)attributeDict { 
    if([elementName isEqualToString:@"kml"]) { 
     appDelegate.cars = [[NSMutableArray alloc]init]; 
    } 
    else if([elementName isEqualToString:@"Placemark"]) { 
     aCar = [[Car alloc]init]; 
    } 
    else 
    return; 
} 


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

} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if([elementName isEqualToString:@"kml"]) 
     return; 
    if([elementName isEqualToString:@"Style"]) 
     return; 
    if([elementName isEqualToString:@"IconStyle"]) 
     return; 
    if([elementName isEqualToString:@"Icon"]) 
     return; 
    if([elementName isEqualToString:@"color"]) 
     return; 
    if([elementName isEqualToString:@"colorMode"]) 
     return; 
    if([elementName isEqualToString:@"scale"]) 
     return; 
    if([elementName isEqualToString:@"href"]) 
     return; 
    if([elementName isEqualToString:@"styleUrl"]) 
     return; 
    if([elementName isEqualToString:@"a"]) 
     return; 

    if([elementName isEqualToString:@"Placemark"]) { 
     [appDelegate.cars addObject:aCar]; 
     [aCar release]; 
     aCar = nil; 
    } 

    else if([elementName isEqualToString:@"name"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
    } 

    else if([elementName isEqualToString:@"description"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
     [currentElementValue setString:@""]; 
    } 
    else if([elementName isEqualToString:@"coordinates"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
     [currentElementValue setString:@""]; 
     NSLog(@"aCar coordinates:%@", [aCar coordinates]); 
    } 
    else 
     return; 
} 

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

@end 

/루프

답변

0

귀하의 코드 확인을 보이는 ... 대리자 클래스에 정의 된 코드에서 볼 수있다. 위치 표시 태그에 포장 된 요소가 XML에 포함되어 있습니까?

xml에 둘 이상의 kml 요소가 있습니까? 원래 배열이 삭제되고 길이가 0 인 새로운 배열로 대체되는 빈 배열이있을 수 있습니까?

+0

나는 또한 의심 스럽지만. kml 요소를 얻을 때마다 appDelegate.cars를 날려 버리고 있습니다. 네가하고 싶은지 아닌지 나는 모른다. – amattn

-1

mutableArray를 제대로 초기화하기 위해 initWithCapacity 메소드를 사용할 필요가 없습니까?

직접 appDelegate.cars를 사용하는 대신 로컬 MutableArray를 사용해보고 다른 것이 있는지 확인하십시오.

+0

initWithCapacity는 배열에 저장할 항목 수를 미리 아는 경우 메모리를 절약하는 데 도움이됩니다. 개인적으로 나는 성장하지 않을 고정 배열을 만들지 않는 한 거의 사용하지 않습니다. – amattn