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,巧合的是,十进制为 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 回答