运行以下代码时,iOS应用程序崩溃

时间:2011-10-05 14:04:05

标签: iphone objective-c ios xcode xcode4

我是初学者,建立一个计算器让自己熟悉ObjC。

到目前为止,我的代码运行正常,但以下代码除外。

此功能链接到5个按钮。

问题在于,当我第一次按下任何按钮时,代码运行完美,第二次也是如此,但第三次失败。它总是第三次失败。在第三次按下的屏幕上,按钮本身消失并编程停止,然后崩溃。

-(void) displayOnScreenValue{
[mainDisplay setText:onScreenTextValue];
}

-(void) pressOperatorButton:(id)sender{

    UIButton *pressedOpp = (UIButton *)sender;

    onScreenValue = [onScreenTextValue doubleValue]; //onScreenValue is Double

if (!opJustSet) {

    switch (opSelected) {
        case 0:  //Equal
            //mainDisplay.text = @"=";
            accuValue = onScreenValue;
            break;
        case 1:  //Plus
            //mainDisplay.text = @"+";
            accuValue = accuValue + onScreenValue;

            break;
        case 2:  //Minus
            //mainDisplay.text = @"-";
            accuValue = accuValue - onScreenValue;
            break;
        case 3: //Multiply
            //mainDisplay.text = @"x";
            accuValue = accuValue * onScreenValue;
            break;
        case 4: //Divide
            //mainDisplay.text = @"d";
            accuValue = accuValue / onScreenValue;
            break;

        default:
            break;
    }
    NSNumber* value = [NSNumber numberWithDouble:accuValue];
    onScreenTextValue =[value stringValue];
    [self displayOnScreenValue];
    opJustSet = YES;
    [value release];

}

signChangeSet = NO;
dotUsed = NO;
decimalValue = 0;
opSelected = pressedOpp.tag;

//[self displayOnScreenValue];
[pressedOpp release];
}

2 个答案:

答案 0 :(得分:5)

在此代码中:

NSNumber* value = [NSNumber numberWithDouble:accuValue];
onScreenTextValue =[value stringValue];
[self displayOnScreenValue];
opJustSet = YES;
[value release];

你不应该释放价值。你只需要释放你调用alloc,一个复制方法, 或者如果你叫保留它。大多数消息都会返回一个将自动释放的对象。

同样适用于此

 [pressedOpp release];

删除它 - 你没有分配pressedOpp(或保留它)

另外,我不知道onScreenTextValue是什么,但它应该是@property with(retain)。如果是这样,您需要像这样访问:

 self.onScreenTextValue = [value stringValue];

要获得自动保留(在Objective-C中,self.name和name不是一回事 - 第一个使用属性,第二个是对字段的原始访问,绕过生成的setter)

  1. 熟悉引用计数语义

    http://www.loufranco.com/blog/files/managing-memory-iphone.html

  2. - 或 - 升级到最新的Xcode并使用自动引用计数。

  3. 另一个简单的事情是始终运行“构建和分析”并确保解决每个问题。它非常适合发现不正确的版本(事实上,相同的代码是自动引用计数的背后)

答案 1 :(得分:1)

您没有正确管理内存。例如,代码

onScreenTextValue =[value stringValue];

使用自动释放的值分配给字段。您应该始终保留字段并稍后将其释放。

此外,您正在发布已自动发布的value。这意味着当自动释放池耗尽时(通常在事件循环期间),它将被双重释放。