3

私はscrollViewDidScrollメソッドからこのコードを実行しています(スクロールすると実行されます!):

NSString *yearCount = [[NSString alloc] initWithFormat:@"%0.1f", theScroller.contentOffset.y];  
years.text = yearCount; 
[yearCount release];

これは正常に機能しますが、スクロールのパフォーマンスに影響します(速度が低下するとジャダーが発生します)

私の質問は、allocとreleaseを使い続ける必要がありますか、それともinitWithFormatを使用していくつかの数値をそれなしのテキストに取得する方法はありますか?

4

3 に答える 3

3
years.text = [NSString stringWithFormat:@"%0.1f", theScroller.contentOffset.y];

自動解放されるため、文字列を明示的に解放する必要がなくなります。

ただし、速度低下を避けたい場合は、フィールドの更新頻度を下げることを検討してください。たとえば、scrollViewDidScroll呼び出されるたびにタイマーを設定して、たとえば 0.1 秒後にフィールドを更新しますが、タイマーが以前の呼び出しから既に実行されている場合はそうではありません。これにより、UI を最新の状態に保ちながら、呼び出しの数を減らすことができます。


これを行う方法の例を次に示します。スクロール ビュー デリゲートのインターフェイス宣言NSTimerで を宣言します。

NSTimer *timer;

そして方法:

- (void)updateYear:(NSTimer*)theTimer
{
    timer=nil;
    UIScrollView *theScroller=[theTimer userInfo];
    years.text=[NSString stringWithFormat:@"%0.1f", theScroller.contentOffset.y];
}

- (void)scrollViewDidScroll:(UIScrollView *)theScroller
{
    if (!timer) {
        timer=[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateYear:) userInfo:theScroller repeats:NO];
    }
}

明らかに、時間間隔として使用する必要はありません0.1。速くしたり遅くしたりして、何が最適かを確認できます。

この例は、メモリ管理に関する限り完全であることに注意してください。タイマー オブジェクトを自分で保持または解放しようとしないでください。その存続期間は、runloop によって内部的に処理されます。

于 2011-03-16T08:58:45.870 に答える
1

文字列の書式設定や alloc-release が原因ではないため、パフォーマンスが低下することは絶対にありません。次のような短い形式を使用できます。

years.text = [NSString stringWithFormat:@"%0.1f", theScroller.contentOffset.y];

これはと同等です

years.text = [[[NSString alloc] initWithFormat:@"%0.1f", theScroller.contentOffset.y] autorelease];

ただし、これはパフォーマンスの向上にはまったく役立ちません。

于 2011-03-16T09:01:49.850 に答える