NSString分配与否!

时间:2011-03-16 08:36:41

标签: objective-c nsstring alloc

我正在使用scrollViewDidScroll方法运行此代码(因此当您滚动时它会运行!):

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

工作正常,但它会在滚动上达到性能(导致它在减速时抖动)

我的问题是,我是否需要继续使用alloc和release,或者有没有办法在没有它的情况下使用initWithFormat获取一些数字?

3 个答案:

答案 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];

然而,这根本无助于改善您的表现。