2009-05-31 7 views
3

私は私のコンソールにエラーを取得しています:"isEqualToString" ココアエラー

2009-05-30 20:17:05.801 ChuckFacts [1029:20B] *** - [ジョークisEqualToString:]:認識されません

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Joke"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil]; 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
            reuseIdentifier:CellIdentifier] autorelease]; 
    cell = tableCell; 
} 

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 
NSString *dateText = formattedDateString; 
UILabel *dateTextLabel = (UILabel*) [cell viewWithTag:2]; 
dateTextLabel.text = dateText; 
[self todaysDate]; 
return cell; 
} 

「ジョーク」完全な配列である: セレクタはここ

0x52e2f0が、私はエラーがから来ていると考えている私のコードでインスタンスに送信しましたあなたが知っておく必要がある場合は冗談を言う。

なぜこのエラーが発生するのですか?

インスタンスに送信

0x52e2f0

を私は「0x52e2f0は」そう、見つけることが容易になるだろう何であるかを判断するにはどうすればよい:

また、あなたが言うエラーの一部を見ています次回問題?

+0

正確な複製:http://stackoverflow.com/questions/865527/cocoa-i-have-an-error-and-after-reading-and-trying-to-figure-it-out-i-cant –

答えて

18

なぜこのエラーが発生しますか?

isEqualToString:をJokeオブジェクトに送信していて、JokeオブジェクトがisEqualToString:に応答しないためです。

あなたは意図的にそのメッセージをあなたのJokeオブジェクトに送信しているとは限りません。代わりに、JokeオブジェクトをNSStringオブジェクトが必要なものに渡すか、返すことになります。

あなたはjokesが「冗談いっぱいの配列」だと言います。しかし、あなたのコードでは、あなたがこれを行う:

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 

は例外で行く、私は「ジョークの完全な配列」で、あなたは「ジョークオブジェクトの配列を」意味推測しています。

変数NSString *にJokeオブジェクトを配置しても、JokeオブジェクトはNSStringに変換されません。あなたがしているのは、変数にNSStringが含まれていることをコンパイラに伝えてから、その代わりにJokeを入れておくだけです。私はこれを「コンパイラに嘘をつく」と呼びます。

これを固定する最初のステップは、嘘を削除し、その場所に真実を復元することです:

Joke *joke = [jokes objectAtIndex:indexPath.row]; 

あなたはこれをやった後、すぐにコンパイルする場合、あなたはコンパイラはあなたに警告を与え始めていることに気づくでしょう後行のカップル:

jokeTextLabel.text = jokeText; 

警告:引数1を渡す 'のsetText:' 別個のObjective-C型

01から

もちろん、そうです。ジョークはまだNSStringではありません。変数の型について正直であるので、コンパイラはこれをあなたのために捕まえることができます。

実際の修正は、あなたがそのテキストのジョークオブジェクトを要求したとき(私はそれが、このためのプロパティを持っており、そのプロパティの値はNSStringのであると仮定)来るとjokeTextLabel.textセッターにことを与えます。

"0x52e2f0"はどのようにして次回に問題を見つけるのが簡単になるのですか?

Xcodeの[ブレークポイント]ウィンドウで、objc_exception_throwにブレークポイントを設定します。次に、プログラムを実行します。例外が発生すると、デバッガはプログラムを停止し、デバッガウィンドウが開きます。次に、Debugger Consoleに「po 0x52e2f0」と入力します。 (poは「印刷オブジェクト」を表します)

これはMacアプリで動作します。私はそれもiPhoneアプリのために働くだろうと仮定しています。

+0

もうひとり素晴らしい答えがあります。 – Abizern

2

「冗談がいっぱいの配列」とは、明らかに「種類の冗談のあるクラスの配列」を意味します。 UILabelのtextプロパティにJokeオブジェクトを割り当てることはできません。それにはNSStringしかかかりません。

(それは文字列を望んでいるとき、ココアは、Javaまたは任意のオブジェクトは、いくつかの.toString()メソッドを介して自動的に文字列に強制変換することができますC++のようではありません。一般的なフレームワークがNSStringの明示を要求します。)

ここは何です起こっているのは、オブジェクトをtextプロパティに割り当てることです。 Cocoaでは、NSString(暗黙的にNSStringであると理解されているため、この場合は警告なしでも、このような型で素早く遊べます)。しかし、JokeオブジェクトのisEqualToString:(NSStringメソッド)を呼び出そうとすると、もちろん失敗します。

代わりに、ジョークのテキストをラベルに割り当てる必要があります。

オブジェクトの識別方法:デバッガでpo 0x52e2f0コマンドを発行できます。通常はメモリが完全にボークされていない場合に機能します。そのアドレスにあるオブジェクトのObjective-C表現を出力します。

+1

NSArrayメッセージobjectAtIndex: 'id'を返します。これは、警告なしで任意のポインタ型に強制可能です。 –

+0

本当にあなたは正しいです。修正されました。 –

+0

実際には、-descriptionメソッドを使用して任意のオブジェクトの文字列表現を取得できます。デフォルトの実装では、あなたがそれをオーバーロードしない限り、のようなものが返されます。 –

関連する問題