我是初学者,建立一个计算器让自己熟悉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];
}
答案 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)
熟悉引用计数语义
http://www.loufranco.com/blog/files/managing-memory-iphone.html
- 或 - 升级到最新的Xcode并使用自动引用计数。
另一个简单的事情是始终运行“构建和分析”并确保解决每个问题。它非常适合发现不正确的版本(事实上,相同的代码是自动引用计数的背后)
答案 1 :(得分:1)
您没有正确管理内存。例如,代码
onScreenTextValue =[value stringValue];
使用自动释放的值分配给字段。您应该始终保留字段并稍后将其释放。
此外,您正在发布已自动发布的value
。这意味着当自动释放池耗尽时(通常在事件循环期间),它将被双重释放。