2011-10-30 5 views
1

단일 배열 객체 (여러 값의 nsdictionary)를 기본보기로 전달하려고합니다.NSArray는 NSZombie 오류를 나타냅니다.

기본적으로보기를 설정할 때 일부 xml을 사전 배열로 구문 분석합니다. 그런 다음 NSdictionary 내부의 값 중 하나를 사용하여 tableview를 설정하고이 값은 알파벳순 스크롤러와 섹션 제목을 설정하는데도 사용됩니다. (이것은 내가 작성한 메소드에서 수행됩니다)

해당 메소드의 끝에서 [self.tableView reloadData];를 호출합니다. 모든 것이 완벽하게로드되고 모든 것이 잘 표시됩니다.

이제는 셀을 선택하면 cell.textlabel 내의 값을 확인하고이를 사전의 배열에 대조하는 데 사용할 수 있도록 설정하려고합니다. entry 나는 그 사전을 내가 만든 Delegate와 함께 메인 뷰로 전달하려고한다.

그러나 나는 내 reloadData 때문에 일어날 수 있다고 생각되는 오류가 발생하고 있지만 확실하지는 않습니다. 내 조건 자의 모양입니다.

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text]; 
      NSArray *filter = [myDataArray filteredArrayUsingPredicate:pred]; //error happens here 
      //check to see if the value is the correct one 
      NSLog(@"My Filtered array = %@", filter); 
      //once problem has been found set up the delegate here. 

이 오류 메시지가 표시됩니다. 아래와 같은

2011-10-31 10:43:57.333 code[5812:207] *** -[__NSArrayM filteredArrayUsingPredicate:]: message sent to deallocated instance 0x6874210 

myDataArray는 NSXMLParser 위임에서 생성된다.

//.h

NSMutableArray *myDataArray; 
} 
@property (nonatomic, retain) NSMutableArray *myDataArray; 

//.m

어떤 도움을 크게, 또한 내가 사전의 권리를 모든 값을 전달 대해려고 생각 주시면 감사하겠습니다
#pragma mark - Parsing lifecycle 

- (void)startTheParsingProcess:(NSData *)parserData 
{ 

    //myDataArray = [NSMutableArray arrayWithCapacity:8]; // not even sure if this is needed as its declared later on. 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process 

    [parser setDelegate:self]; 
    [parser parse]; // starts the event-driven parsing operation. 
    [parser release]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"Row"]) 
    { 
     manufactureMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict]; 
    } 
    if([elementName isEqualToString:@"Rows"]) 
    { 
     myDataArray = [NSMutableArray arrayWithCapacity:8]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if([elementName isEqualToString:@"Row"]) 
    { 
     [myDataArray addObject:manufactureMutableDictionary]; 
    } 
    [manufactureMutableDictionary release]; 
    manufactureMutableDictionary = nil; 
} 

방법?

+1

는 당신이 우리를 보여줄 수 더 나은? – edc1591

+0

나는 위에 추가했다 : 0 –

+0

방금 ​​추가 한 코드가'NSPredicate' 코드와 같은 클래스에 있습니까? – edc1591

답변

4

당신은 autorelease D 어레이를 사용

myDataArray = [NSMutableArray arrayWithCapacity:8]; 

당신은 정말 설정 특성 예 사용할 가지고

self.myDataArray = [NSMutableArray arrayWithCapacity:8]; 

또는`myDataArray` 어디에서 오는지

NSMutableArray *tmpMyDataArray = [[NSMutableArray alloc] initWithCapacity:8]; 
self.myDataArray = tmpMyDataArray; 
[tmpMyDataArray release]; tmpMyDataArray = nil; 
+0

ahhH !!!!! 나는 지난 주에 여러 가지 기억 문제가 생겨서 많은 것을 보관하고 있기 때문에 자기 자신에 관한 모든 것을 읽었던 문제를 찾기 위해 독서를 많이 해왔다. +1 등 ... 그 tho에 대한 환호! 그리고 다시 한 번 새로운 것을 배웠습니다 :) –

+0

오, 왜 두 번째 예가 첫 번째 예보다 나은가요? –

+0

우리가 언제 메모리를 비우고 싶은지에 대해 더 분명히합니다. autoreleased 버전은 현재 실행 루프가 끝날 때 메모리를 비 웁니다 (이 문제를 해결할 수있어서 기쁩니다). iOS 기기와 같이 메모리가 제한적인 기기에서는 메모리를 최적으로 사용하는 것이 좋습니다. –

관련 문제