2011-01-17 3 views
0

저는 Objective-C & iPhone 개발의 초보자이므로 나와 함께하시기 바랍니다.NSMutableArray 및 NSXMLParser에서 채워진 개체 검색에 문제가 발생했습니다.

나는 UITableView로로드하는 응용 프로그램을 만들고 "주소록"이라는 특정 셀을 선택하면 웹 요청에서 검색 한 모든 주소를 포함하는 다른 UITableView를로드해야합니다. NSXMLParser의 델리게이트 메서드를 사용하여로드 된 뷰의 헤더 파일에 정의 된 NSMutableArray에 해당 주소를 저장합니다. 하지만 문제는 해당 주소가 UITableView 셀에 표시 될 때 발생합니다 (예, 셀 수에 대한 카운트가 있음). 아무도이 문제로 나를 도울 수 있습니까? 나는 일 동안 이것을 지금 붙들 게된다! !! 응용 프로그램의 충돌의 가능성이 가장 높은 이유는 cellForRowAtIndexPath에서이 줄

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

AddressEntry *entry = (AddressEntry *)[self.addresses objectAtIndex:indexPath.row]; 

@try 
{ 
    NSLog(@"%@", entry.firstName); 
} 
@catch (NSException * e) 
{ 
    @try 
    { 
     NSLog(@"%@", entry.lastName); 
    } 
    @catch (NSException * e) 
    { 
     NSLog(@"%@", entry.lastName); 
    } 
} 
[entry release]; 

return cell; 
} 

    - (void)parserDidStartDocument:(NSXMLParser *)parser 
{ 
    self.currentElement = nil; 
    self.f_Name = nil; 
    self.l_Name = nil; 
    self.phone = nil; 
    self.email = nil; 
    count = 0; 
    self.addresses = [[NSMutableArray alloc] init]; 
} 

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


if([elementName isEqualToString:@"Entries"]) 
    { 
     count = [[attributeDict valueForKey:@"total"] intValue]; 
    } 
    else if([elementName isEqualToString:@"FirstName"]) 
    {  
     [self.f_Name release]; 
     self.f_Name = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"LastName"]) 
    { 
     [self.l_Name release]; 
     self.l_Name = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"PhoneNumber"]) 
    { 
     [self.phone release]; 
     self.phone = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"EmailAddress"]) 
    { 
     [self.email release]; 
     self.email = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"Record"]) 
    { 
     [self.addrEntry release]; 
     self.addrEntry = [[[AddressEntry alloc] init] retain]; 
    } 

[self.currentElement release]; 
self.currentElement = nil; 
self.currentElement = [elementName copy]; 
} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
             namespaceURI:(NSString *)namespaceURI 
             qualifiedName:(NSString *)qName 
{ 
    // 
    if([elementName isEqualToString:@"FirstName"]) 
     self.addrEntry.firstName = self.f_Name; 
    else if ([elementName isEqualToString:@"LastName"]) 
     self.addrEntry.lastName = self.l_Name; 
    else if([elementName isEqualToString:@"PhoneNumber"]) 
     self.addrEntry.mobile = self.phone; 
    else if([elementName isEqualToString:@"EmailAddress"]) 
     self.addrEntry.emailAddress = self.email; 
    else if([elementName isEqualToString:@"Record"]) 
    { 
     [self.addresses addObject:self.addrEntry]; 
     [self.addrEntry release]; 
     self.addrEntry = nil; 
     /*AddressEntry *e = (AddressEntry *)[self.addresses lastObject]; 
     NSLog(@"%@ %@ %@ %@", e.firstName, e.lastName, e.mobile, e.emailAddress); 
     [e release];*/ 
    } 
} 


- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if([currentElement isEqualToString:@"FirstName"]) 
     self.f_Name = string; 
    else if([currentElement isEqualToString:@"LastName"]) 
     self.l_Name = string; 
    else if([currentElement isEqualToString:@"PhoneNumber"]) 
     self.phone = string; 
    else if([currentElement isEqualToString:@"EmailAddress"]) 
    { 
     self.email = string; 
    } 

} 
+0

실제 문제는 무엇입니까? – MusiGenesis

+0

명확하지 않은 것에 대해 사과드립니다. 앱이이 줄을 칠 때 충돌합니다. { NSLog (@ "% @", entry.firstName); } –

+0

누구든지 제발 (내 머리에) 죽이는 것을 도와주세요 !!! –

답변

0

입니다 : 다음은 내 코드입니다

[entry release]; 

당신은 alloc/init이 변수 entryrelease를 호출하지 않았다 그것. 해당 행을 제거하십시오.

해당 방법에서 entry은 주소 배열에 이미 할당 된 개체에 대한 참조 만 보유하고 있습니다. 객체를 소유하지 않기 때문에 객체를 놓아서는 안됩니다.

This page in the Apple docs은 메모리 관리를위한 좋은 흐름도와 몇 가지 간단한 규칙을 보여줍니다.


충돌과 관련없는 별도의 문제로 @try/@catch을 사용하는 것이 불필요한 것처럼 보입니다. 자세한 내용은 this answer을 참조하십시오. foundCharacters의 충돌에 마지막으로, 또한 관련이없는


, 당신은 정말 당신의 데이터에 string 매개 변수를 추가 할 대신 그 방법은 같은 값 내에서 여러 번 호출되는 것이 가능하기 때문에 단지 지정해야합니다. 예를 들어 Handling XML Elements and Attributes을 참조하십시오.

+0

답변 해 주셔서 감사합니다. 그러나 나는 어젯밤에 그 변경을했고 지금은 적어도 앱이 충돌하지 않는다. 그러나 그것은 NSMutablePreceer 델리게이트 메소드에있는'NSMutableArray'라는 또 다른 악의적 인 문제에 부딪혔다. (UITableView의'cellForRowAtIndexPath' 메소드에서 같은 요소에 접근하려고하면, 디버거를 사용할 때 때때로'변수는 CFString이 아니며'obj_msgsend'에서 멈추게됩니다. 때때로 언젠가는 모든 테이블 셀을 채 웁니다. (계속 ...) –

+0

(계속. ..) 배열에 푸시 된 마지막 객체! 이것은 내게 열매를 맺고 있습니다.이 점을 밝혀 주시겠습니까? 그리고 '@try \ @ catch'및 'appendString' 제안을 주셔서 감사합니다. –

+0

죄송합니다, 지금 막 해결했다고 생각합니다. 그게'appendString'이고 결과적으로'self.f_Name'의 타입을 NSMutableString으로 변경 한 것 같습니다. 고맙습니다 aBitObvious. –

관련 문제