【问题标题】:iOS App crashing when following code is run运行以下代码时 iOS 应用程序崩溃
【发布时间】:2011-10-05 14:04:05
【问题描述】:

我是一个初学者,正在构建一个计算器来熟悉 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];
}

【问题讨论】:

    标签: iphone objective-c ios xcode xcode4


    【解决方案1】:

    在这段代码中:

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

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

    这个也一样

     [pressedOpp release];
    

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

    另外,我不知道 onScreenTextValue 是什么,但它可能应该是带有(保留)的@property。如果是这样,您需要像这样访问:

     self.onScreenTextValue = [value stringValue];
    

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

    1. 熟悉引用计数语义

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

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

    另一件简单的事情是始终运行“构建和分析”并确保修复每一个问题。它非常善于发现错误的版本(事实上,自动引用计数背后的代码是相同的)

    【讨论】:

    • onScreenTextValue 是一个 NSString。目前我在 SL 上使用 Xcode 4.02。目前我没有发布任何“构建和分析”
    • 添加 this.onScreenTextValue 让我“使用未声明的标识符 'this'”
    • 谢谢,我只是删除了 value 并 pressOpp 释放,一切正常。再次感谢
    【解决方案2】:

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

    onScreenTextValue =[value stringValue];
    

    使用自动释放值分配给字段。您应该始终保留字段并在以后释放它们。

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

    【讨论】:

    • 正如我所说,我是一个初学者。 onScreenTextValue 是一个 NSSTring*。正确的写法是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2017-10-01
    • 2022-01-20
    相关资源
    最近更新 更多