2011-03-16 3 views
3

는 내가 scrollViewDidScroll 방법에서이 코드를 실행하고 (그래서 당신은 스크롤 할 때 그것을 실행!) 잘 작동NSString 할당 여부

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

그러나 그것은 스크롤의 성능 안타

(가 느려대로 떨림 원인)

내 질문에, 계속 alloc 및 release를 사용해야합니까, 아니면 initWithFormat을 사용하여 일부 텍스트에 숫자가없는 일부 숫자를 가져 오는 방법이 있습니까?

답변

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에 의해 내부적으로 처리됩니다.

+1

이것은 문자열을 장면 뒤에 할당하는 편리한 방법 일뿐입니다. 대안이 아닙니다. – Chuck

+0

나는 이제 더 완전한 대답을 추가했다. –

+0

많은 감사, 나는 타이머를 설정하려고합니다. – mtompson

1

문자열 형식 또는 할당 해제로 인해 성능이 저하되었습니다. 그러나이 전혀 성능을 개선하는 데 도움이되지 않습니다

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

에 해당합니다

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

: 당신은 같은 몇 가지 짧은 양식을 사용할 수 있습니다.

+0

이것은 좋은 물건이다. 타이머를 들여다 볼 것이다. 많은 감사 – mtompson

+0

왜 alloc 버전을 신경 쓰지 않는가! ? – mtompson

+0

@Mark 때로는 문자열을 자동 갱신하고 싶지 않을 수도 있습니다.이 경우에는'alloc '하지만'autorelease'가 아닙니다. 그러므로'alloc' /'release'는 좀 더 세밀한 제어를 제공 합니다만, stringWithFormat은 문자열을 자동으로 리오리스 할 때 더 편리합니다. –

2

잦은 업데이트를 피하려면 scrollViewDidEndDecelerating 메서드를 사용하는 것이 좋습니다. Alloc-init은 성능 저하를 초래하지 않으며 텍스트를 자주 설정합니다. 지속적으로 변경해야하는 경우가 아니면 (타이머가있는 솔루션이 옵션 일 수 있음), 다른 후크 방법을 찾아야합니다.

+0

감사합니다. Thomas 저는 항상 타이머가 필요하므로 타이머 옵션이 좋습니다. – mtompson