2

常に更新している文字列があります(1秒間に約33回)。それは何度も何度も使用され、私が行っているループの中に遍在しています。これはループです:

- (void)add{
    int r = (arc4random() % 30) + 51;
    long long debtInt = [debtString longLongValue];
    long long multiplier = r;
    long long debtAdj = multiplier + debtInt;
    debtString = [NSString stringWithFormat:@"%lli", debtAdj];
    [debtString retain];
    [self formating];
}

- (void)formating{
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber * myNumber = [f numberFromString:debtString];
    [f release];

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setMaximumFractionDigits:0];
    NSString *formattedNumberString = [numberFormatter stringFromNumber:myNumber];
    [numberFormatter release];

    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 325, 100)];
    myLabel.font = [UIFont fontWithName:@"Verdana" size: 20.0];
    myLabel.text = formattedNumberString;
    myLabel.textAlignment = UITextAlignmentCenter;

    [self.view addSubview:myLabel];
    [myLabel release];
}

これは、0.03秒ごとにNSTimerによって起動されます。論理的に解放できると思ったのdebtStringは、longlong整数に変換された後です。ただし、これによりアプリがクラッシュします。行を削除する[debtString retain]と、アプリがクラッシュします。

メモリの蓄積は迅速かつ高速で、14バイトの文字列です。毎秒、さらに462バイトの誤って割り当てられたメモリが作成され、すべての調整とともに、約3696バイト/秒になります。これは私が無視できるリークではありません。ループのどこでリリースするのかわかりません!

4

4 に答える 4

4

この方法でそれを行うことにコミットしている場合はdebtString、値を再割り当てする直前に、ループの各反復でを解放する必要があります。

[debtString release];    
debtString = [NSString stringWithFormat:@"%lli", debtAdj];
[debtString retain];

ただし、ループごとに新しいインスタンスを作成しています。シングルNSMutableString(@OscarMkが提案するような)を使用し、毎回更新する方がよいでしょう。UILabelそして、毎回新しいものを作成しないでください。作成して、ループを通過するたびにコンテンツを更新するだけです。

于 2011-07-19T23:45:45.267 に答える
2

NSMutableStringが頻繁に更新される場合は、特にNSMutableStringを使用する必要があります。

于 2011-07-19T23:39:07.173 に答える
0

stringWithNumber:メソッドを使用すると、自動解放プールにある文字列が返されます。これらは、イベントループに戻ると解放されます。

代わりに、明示的なallocとinitを使用してください。

[debtString release];  // release previous (if any)
debtString = [[NSString alloc] initWithFormat:@"%lli", debtAdj];

債務文字列が保持される@propertyである場合、これはセッターがあなたのために行うことです。

そして、高度にカフェイン化されているのは正しいです。毎回新しいUILabelを作成するのではなく、テキストフィールドを更新するだけです。NSNumberFormatterの場合も同じですが、インスタンス変数として保存して、毎回作成する必要がないようにします(その後、サブビューに1回だけ追加します)。

于 2011-07-20T05:32:51.093 に答える
0

問題は、ヘッダーで変数を合成するのではなく、毎回変数を宣言していたことでした。10分で修正しました。

于 2011-07-21T19:09:11.313 に答える