我正在使用scrollViewDidScroll方法运行此代码(因此当您滚动时它会运行!):
NSString *yearCount = [[NSString alloc] initWithFormat:@"%0.1f", theScroller.contentOffset.y];
years.text = yearCount;
[yearCount release];
工作正常,但它会在滚动上达到性能(导致它在减速时抖动)
我的问题是,我是否需要继续使用alloc和release,或者有没有办法在没有它的情况下使用initWithFormat获取一些数字?
答案 0 :(得分: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 :(得分:2)
考虑使用scrollViewDidEndDecelerating
方法来避免频繁更新。 Alloc-init不对性能下降负责,经常设置文本。除非你真的需要连续改变它(在这种情况下可能有一个定时器的解决方案),你应该寻找一个不同的钩子方法。
答案 2 :(得分:1)
你的表现绝对不是因为字符串格式化或分配释放。你可以使用一些较短的形式,如:
years.text = [NSString stringWithFormat:@"%0.1f", theScroller.contentOffset.y];
相当于
years.text = [[[NSString alloc] initWithFormat:@"%0.1f", theScroller.contentOffset.y] autorelease];
然而,这根本无助于改善您的表现。