为什么iOS模拟器暂停?

时间:2012-12-01 10:52:01

标签: objective-c ios xcode

我正在尝试为计算器创建一个方形按钮,它应该从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) 

这是什么意思,我该怎么办?

3 个答案:

答案 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;