0

我在 iOs 中创建了一个计算器,包括每个数字键作为单独的 UIButton。

我有一个NSString叫做 calcNumberString 的东西,它保存着输入到计算器中的数字。这样我可以检查是否已超过最大位数并阻止用户再输入。

在我的viewDidLoad事件中,我像这样初始化 calcNumberString:

calcNumberString = [[NSString alloc] init];

当我按下数字键(例如 5)时,会触发以下方法:

-(IBAction)buttonPressed5 : (id) sender
{
    if(calcNumberString.length < 10)
    {
        calcNumberString = [calcNumberString stringByAppendingFormat:@"5"];
        calcLabel.text = calcNumberString;
    }
}

这很好用(我最多可以输入 10 位数字)......直到我按下 CLEAR 键:

-(IBAction)buttonPressedClear : (id) sender
{
    calcNumberString = @"";
    calcLabel.text = @"0"
}

它按预期清除,但是当我尝试按另一个数字键之后,我得到EXC_BAD_ACCESS或以下内容NSInvalidArgumentException

[__NSCFSet length]: unrecognized selector sent to instance 0x16c110

方法中有什么buttonPressClear我做错了吗?这显然是问题所在,因为在我清除并尝试输入新数字之前一切正常。

任何帮助将不胜感激。

谢谢!

4

1 回答 1

1

在您的清除按钮操作中,您将 calcNumberString 分配给您没有保留的另一个内存位置。一旦该方法超出范围,该字符串内存位置就消失了。

如果你想继续使用 NSString,正确的代码如下:

[calcNumberString release];
calcNumberString = [@"" retain];

这样你就没有任何内存泄漏。

正如@CodaFi 在评论中提到的,您应该使用NSMutableString

于 2012-07-05T15:34:34.563 回答