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

1 iphone xcode objective-c ios 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];
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*nco 5

在这段代码中:

NSNumber* value = [NSNumber numberWithDouble:accuValue];
onScreenTextValue =[value stringValue];
[self displayOnScreenValue];
opJustSet = YES;
[value release];
Run Code Online (Sandbox Code Playgroud)

你不应该释放价值.只有在调用alloc,复制方法或调用retain时才需要释放.大多数消息都会返回一个将自动释放的对象.

同样如此

 [pressedOpp release];
Run Code Online (Sandbox Code Playgroud)

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

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

 self.onScreenTextValue = [value stringValue];
Run Code Online (Sandbox Code Playgroud)

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

  1. 熟悉引用计数语义

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

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

另一个简单的事情是始终运行"构建和分析"并确保解决每个问题.找到不正确的版本真的很擅长(事实上,同样的代码是自动引用计数的背后)