0

各数値キーを個別の UIButton として含む電卓を iOs で作成しました。

電卓に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 に答える