NSString выделить или нет! - PullRequest
3 голосов
/ 16 марта 2011

Я запускаю этот код из метода scrollViewDidScroll (поэтому он запускается при прокрутке!):

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

, который работает нормально, однако он наносит удар по производительности на свитке (заставляя его дрожать, когда он замедляется)

У меня вопрос: нужно ли продолжать использовать alloc и release или есть способ получить некоторые числа с помощью initWithFormat для некоторого текста без него?

Ответы [ 3 ]

3 голосов
/ 16 марта 2011
years.text = [NSString stringWithFormat:@"%0.1f", theScroller.contentOffset.y];

избавит от необходимости явно освобождать строку, так как она автоматически высвобождается.

Однако, если вы пытаетесь избежать замедления, рассмотрите возможность обновления поля реже. Например, каждый раз, когда вызывается scrollViewDidScroll, установите таймер для обновления поля, скажем, через 0,1 секунды, но не в том случае, если таймер уже запущен после предыдущего вызова. Это уменьшает количество вызовов при сохранении обновленного интерфейса.


Вот пример, как вы могли это сделать. Объявите 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 в качестве временного интервала, вы можете попробовать сделать его быстрее или медленнее и посмотреть, что работает лучше.

Обратите внимание, что этот пример завершен в том, что касается управления памятью. Вы не должны пытаться самостоятельно сохранять или освобождать объект таймера. Его время жизни обрабатывается внутренним циклом запуска.

2 голосов
/ 16 марта 2011

Попробуйте использовать метод scrollViewDidEndDecelerating, чтобы избежать частых обновлений. Alloc-init не несет ответственности за снижение производительности, часто задавая текст. Если вам действительно не нужно постоянно менять его (в этом случае решение с таймером может быть вариантом), вы должны искать другой метод подключения.

1 голос
/ 16 марта 2011

У вас низкая производительность абсолютно не из-за форматирования строки или alloc-release.Вы можете использовать более короткую форму, например:

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

, что эквивалентно

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

Однако это никак не поможет улучшить вашу производительность.

...