2011-10-30 5 views
1

私は1つの配列オブジェクト(いくつかの値のnsdictionary)をメインビューに渡そうとしています。NSArrayはNSZombieエラーを返します

基本的に私はビューを設定するときにいくつかのXMLを辞書の配列に解析します。次に、NSdictionary内の値の1つでテーブルビューを設定します。この値はアルファベット順のスクロールとセクションタイトルの設定にも使用されます。 (これは私が作成したメソッドで行われます)

私は[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

はあなたが私たちを見ることができ、より良いですか? – 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

ああ、なぜ2番目の例は最初のものより優れていますか? –

+0

いつ私たちがいつメモリを解放したいかについてはっきりしています。オートリリースされたバージョンは、現在の実行ループの最後にメモリを解放するだけだと私は信じている(私はこれで訂正されてうれしい)。 iOSデバイスのようなメモリが制約されているデバイスでは、メモリを最適に使用することを確認することをお勧めします。 –

関連する問題