1

電卓用の四角いボタンを作成しようとしています。MainLabel から値を取得し、それ自体で乗算してから更新して結果を表示する必要があります。

私が使用しているコードは次のとおりです。

- (IBAction)squarePressed:(id)sender
{

    NSString *mainLabelString = mainLabel.text;

    int mainlabelValue = [mainLabelString intValue];

    NSString *calculatedValue = ((mainlabelValue)*(mainlabelValue));

    mainLabel.text = calculatedValue;

} 

シミュレーターでボタンを押すと、一時停止し、スレッド 1 が最後の行でこれを言います。

Thread 1: EXC_BAD_ACCESS (code=2, address= 0x51) 

これはどういう意味ですか、どうすればいいですか?

4

3 に答える 3

2

これは、何もないオブジェクトにアクセスしようとしていることを意味します。割り当てが解除されたオブジェクト、またはメモリ内のガベージを指すポインターにメッセージが送信されました。

メソッドとデバッグにブレークポイントを設定する必要があります。コードがヒットしたかどうかを確認するために。そうである場合は、問題のある行をステップスルーして特定し、どのポインターが悪いかを特定するだけです (デバッガーでオブジェクトを出力してみてください)。

エラーの正確な原因を知ることは不可能ですが、コードに基づいて推測しようとするとmainLabel、Interface Builder での接続を忘れている可能性があります。そのため、メソッドの実行時に有効なラベルを指していません。 ?

次の (そしてより可能性の高い) エラーの原因は、mainLabel.textポインターに整数値を割り当てることです。ここで警告が表示されるはずですが、それを無視すると整数がポインタとして割り当てられます。明らかに、その整数が有効な ObjC オブジェクトへのポインターである可能性は非常に低いため、mainLabel.text再度アクセスしようとするとプログラムは失敗します。別の回答で説明されているように、次の番号の文字列を作成する必要があります。

NSString *calculatedValue = [NSString stringWithFormat: @"%d", mainLabelValue*mainLabelValue];

ひょっとしてエラーが出たときに試した数字は 9 でしたか?このメッセージは、メモリ位置 0x51 にアクセスしようとしたことを示しています。これは偶然にも 10 進数で 81 = 9*9 です。を使用stringWithFormatして数値を文字列としてフォーマットし、返された文字列ポインターを文字列ポインタープロパティに割り当てるとmainLabel.text、問題が解決します。自分のタイプに注意する必要があります。

于 2012-12-01T10:57:40.183 に答える
1

アウトレットからアクション、UI までのすべての接続を確認します。

次に、このコードを確認します。

- (IBAction)squarePressed:(id)sender
{

  int mainlabelValue = [mainLabel.text intValue];

  NSString *calculatedValue = [NSString stringWithFormat:@"%d",(mainlabelValue)*(mainlabelValue)];

  mainLabel.text = calculatedValue;

} 
于 2012-12-01T10:57:29.933 に答える
1

ここでコンパイラがエラーや警告を表示しない理由はわかりませんが、int を文字列に直接キャストすることはできません。

代わりに次のようにします。

NSString *mainLabelString = mainLabel.text;
int mainlabelValue = [mainLabelString intValue];
NSString *calculatedValue = [NSString stringWithFormat: @"%d",mainLabelValue*mainLabelValue];
mainLabel.text = calculatedValue;
于 2012-12-01T10:57:59.883 に答える