2011-10-30 40 views
1

我想通過一個單一的數組對象(這是一個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

回答

4

您正在使用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設備這樣的內存受限的設備中,確保我們最佳地使用我們的內存是很好的。 –