NSArray给NSZombie错误

问题描述:

我想通过一个单一的数组对象(这是一个nsdictionary的几个值)回我的主视图。NSArray给NSZombie错误

基本上,当我设置视图时,我将一些xml解析为一个字典数组。然后,我使用NSdictionary中的一个值设置我的tableview,这个值也用于设置字母滚动条和节标题。 (这是在我创建的方法中完成的)

在该方法结束时,我调用[self.tableView reloadData];每件事物都完美地装载起来,一切都很好。

现在我想要做的就是设置它,这样当选中一个单元格时,我检查cell.textlabel中的值并将其用作谓词来检查字典数组一旦它找到相应的条目我想用我已经创建的代表将该字典传递给主视图。

但是我得到一个错误,我认为,由于我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

你能告诉我们在哪儿'myDataArray'从何而来? – edc1591

+0

我已经在上面添加了:0 –

+0

您刚刚添加的代码与'NSPredicate'代码在同一个类中吗? – edc1591

您正在使用autorelease d阵列

myDataArray = [NSMutableArray arrayWithCapacity:8]; 

你必须设定为使属性例如使用它们

self.myDataArray = [NSMutableArray arrayWithCapacity:8]; 

甚至更​​好

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

ahhH !!!!!我刚刚进行了大量阅读,以找到上周我遇到的一个问题,这个问题是由许多保留创建的不同的内存问题,因此请阅读所有关于自我的内容。是一个+1等......为那个欢呼而欢呼!再次我学到了新的东西:) –

+0

哦,为什么第二个例子比第一个更好? –

+0

当我们想释放内存时,它更加明确。我相信(我很高兴能够纠正这一点),即自动发布的版本只会在当前运行循环结束时释放内存。在像iOS设备这样的内存受限的设备中,确保我们最佳地使用我们的内存是很好的。 –