2011-07-19 8 views
2

私は常に更新しています(〜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]; 
} 

これはNSTimerによって0.03秒ごとに強制終了されます。私が論理的にdebtStringを解放できると思った1つの場所は、長い長い整数に変換された後でした。しかし、これはアプリをクラッシュさせます。 [debtString retain]行を削除すると、アプリがクラッシュします。

メモリのビルドアップは、14バイトの文字列であり、迅速かつ高速です。毎秒462バイトのミスアロケートメモリが作成され、すべての調整とともに、およそ3696バイト/秒になります。これは私が無視できる漏れではありません。私はちょうどループのどこにそれをリリースするか分からない!

答えて

4

、あなたは価値再割り当てする直前に、ループの各反復であなたのdebtStringを解放する必要があります。しかし

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

を、あなたは、新しいインスタンスを作成していますすべてのループ。 1つのNSMutableString(@OscarMkのように)を使い、毎回更新する方が良いでしょう。また毎回新しいUILabelを作成しないでください。ループを作成するたびに内容を更新するだけです。

+0

あなたは動的にそのような場でUILabelのテキストを更新することはできますか? 'mylabel.text'を更新すると自動的にビューに反映されますか? –

+0

はい。 IBに 'UILabel'を追加すると、自分で割り当てる必要はありません。 '.text'プロパティを更新するだけです。 – highlycaffeinated

+0

提案した変更(コードブロック内の変更)を行うと、NSExceptionが発生し、アプリケーションがクラッシュします。 –

2

それは頻繁に更新取得されている場合は、特別NSMutableStringを使用する必要があります。あなたはこのようにそれをやってすることにコミットしている場合

0

あなたはstringWithNumber使用:あなたは自動解放プールにある文字列を取り戻す方法を。これらは、イベントループに戻ると解放されます。 debtStringこれはセッターがあなたのために何をするのかで保持されている@propertyある場合

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

代わりに明示のallocとinitを使用します。

そしてhighlycaffeinatedは右である、単なるテキストフィールドを更新し、新しいUILabelたびに作成しないでください。 NSNumberFormatterの場合と同じですが、インスタンス変数と同じように保存してください。毎回作成する必要はありません(サブビューに一度追加するだけです)。

0

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