我正在尝试为计算器创建一个方形按钮,它应该从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)
这是什么意思,我该怎么办?
答案 0 :(得分:2)
这意味着您尝试访问没有的对象。消息已发送到已解除分配的对象或指向内存中垃圾的指针。
您应该在方法和调试中设置断点;以查看您的代码是否被命中。如果是这样,只需要单步执行并识别有问题的行,然后确定哪个指针是坏的(尝试使用调试器打印对象)。
我们不可能知道错误的确切来源,但如果我应该根据您的代码尝试猜测,也许您忘记在Interface Builder中连接mainLabel
,因此它没有指向运行方法时的有效标签?
您的错误的下一个(也是更可能的)来源是您为mainLabel.text
指针指定一个整数值。你应该在这里得到一个警告,但如果忽略它,整数将被指定为指针。显然,该整数作为指向有效ObjC对象的指针的可能性非常小,因此程序在尝试再次访问mainLabel.text
时失败。如另一个答案所述,您应该创建一个带有数字的字符串:
NSString *calculatedValue = [NSString stringWithFormat: @"%d", mainLabelValue*mainLabelValue];
当你有机会获得错误9时,你试过的号码是多少?消息说你试图访问内存位置0x51,巧合的是81 = 9 * 9(十进制)。使用stringWithFormat
将数字格式化为字符串,并将返回的字符串指针分配给字符串指针属性mainLabel.text
将解决您的问题。你需要注意你的类型。
答案 1 :(得分:1)
检查从插座到操作的所有连接到用户界面。
然后检查此代码:
- (IBAction)squarePressed:(id)sender
{
int mainlabelValue = [mainLabel.text intValue];
NSString *calculatedValue = [NSString stringWithFormat:@"%d",(mainlabelValue)*(mainlabelValue)];
mainLabel.text = calculatedValue;
}
答案 2 :(得分:1)
我不知道为什么编译器不会在这里给你一些错误或警告,但你不能直接将int转换为字符串。
请这样做:
NSString *mainLabelString = mainLabel.text;
int mainlabelValue = [mainLabelString intValue];
NSString *calculatedValue = [NSString stringWithFormat: @"%d",mainLabelValue*mainLabelValue];
mainLabel.text = calculatedValue;