2011-10-31 16 views
1

代理人を使用してNSArray値を親ビューに渡しました。- [__ NSArrayI isEqualToString:]:割り当て解除されたインスタンスにメッセージを送信

私はこのコードを実行すると、それは明らかにデリゲートを実行childviewのテーブルセルを選択するようにしたが、その後フリーズし、ログにこのエラーを発生させた場合、それがそのように

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath 
{ 
    manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"]; 
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]); 
    manufactureResultIndexPath = myIndexPath; 
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell. 
} 

のような親ビューで受信されます

2011-10-31 14:06:16.670 code[12610:207] (
    "Alfa Romeo" 
) 
2011-10-31 14:06:16.673 code[12610:207] *** -[__NSArrayI isEqualToString:]: message sent to deallocated instance 0x6859280 

しかし、私は私のデリゲートメソッドに次の行をコメントアウトした場合

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath 
    { 
     //manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"]; 
     NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]); 
     manufactureResultIndexPath = myIndexPath; 
     [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell. 
    } 

それはクラッシュしないと私はように私のログの正しい詳細とNSLogに終わる。

2011-10-31 14:09:28.200 code[12737:207] (
    Sony 
) 

私は誰かが以前にこのような問題を経験していたと思っています。これは私の配列オブジェクトのように見えます。その値の辞書です。

ISELECT = F; 
ISALIVE = T; 
MANUFACTURER = Sony; 
MANUFACTURERID = 3; 
+0

あなたのキーのうちの1つがそうではありません。あなたがあまりにも多くのリリースをしたので、割り当てが解除されました。 –

+0

コードの他の部分に問題がある可能性があります。あなたはmanufactureSearchObjectStringを使っていましたか? – Bird

+0

確かに同じようなことを考えていますが、エラーが表示されています。これは、** label2.text = manufactureSearchObjectString; **のようにuilabelに値を渡しているところです。**私は間違っていると確信していますが、私はテキスト値に配列を配置しようとしているので、私はisequaltostringや何かをする必要があると思いますか? –

答えて

0

これにコードを変更してみてください:

- (void) setManufactureSearchFields:(NSDictionary *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath 
{ 
    manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] copy]; 
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]); 
    manufactureResultIndexPath = myIndexPath; 
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell. 
} 

私はNSDictionaryarrayValuesの変数の型をも変更したことに注意してください。それがあなたのために働くかどうか私に教えてください。

+0

配列の値を渡しているので、nsdictionaryに変更できませんでした。私はあなたのコードのコピーバージョンを試して、それはまだ同じエラーを持って...それは今は、上記のエラーと私のコードの別の部分を強調表示されます。製造時の値を表示するためのテキストフィールドラベルを設定したとき、私はこれをやるのです。明らかに間違っています。しかし、なぜ私は知らない。 ** label2.text = manufactureSearchObjectString; ** –

+0

多分、配列値を文字列に渡しているからでしょうか? –

1

valueForKey:は、自動リリースされたインスタンスを返します。あなたがそれを保持しない限り、あなたが現在のメソッドから復帰した後にいつか解放されることを期待できます。インスタンス変数に代入しているようです。あなたがそうするなら、あなたはそれを保持する必要があります。

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"]; 
[manufactureSearchObjectString retain]; 

しかし、別の問題があるようです。

[arrayValues valueForKey:@"MANUFACTURER"]; 

これは配列を返します。

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"]; 

変数の名前によって、文字列変数に割り当てられているかのように見えます。したがって、問題を修正すると別のエラーが発生します。 isEqualToStringを呼び出そうとすると、認識できないセレクタが表示されます。

manufactureSearchObjectStringに文字列値を割り当てる必要があります。どのような文字列値にしたいのか把握する必要があります。この場合、配列には1つの文字列しかないので、その文字列が必要です。その場合

manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] objectAtIndex:0]; 
[manufactureSearchObjectString retain]; 

しかし、一般的に、あなたは、アレイ内の複数の値があるかどうかを確認し、必要どちら決定し、また、配列の値がないかどうかを確認し、何かをする必要がありますそれを処理するために正しい。

+0

クールな歓声、私はそれが動作するかどうかを確認するためにチェックしたが、私はあなたのコメントを考慮に入れて、これについてもっと読んでください。私が達成しようとしていることを可能にしていることは知っていますが、少なくとも今のところは、それを清潔にする必要があります。 –

0

NSStringに変換してください。

NSString *manufact=[NSString stringWithFormat:@"%@",[arrayValues valueForKey:@"MANUFACTURER"]; 

クラッシュすることはありません。

関連する問題