2011-03-16 52 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 2011-03-16 09:04:32

+0

我现在添加了一个更完整的答案。 – 2011-03-16 09:08:52

+0

非常感谢,我要设置一个计时器.. – mtompson 2011-03-16 09:19:35

1

你表现糟糕,绝对不是因为字符串格式化或分配释放。您可以使用某种形式的短,如:

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

这相当于

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

然而,这将不利于在所有提高你的表现。

+0

这是好东西,我会看着一个计时器......非常感谢 – mtompson 2011-03-16 09:18:59

+0

为什么还要打扰alloc的版本! ? – mtompson 2011-03-16 11:21:49

+0

@Mark有时你可能不想自动释放字符串,在这种情况下,你会“分配”它而不是“自动释放”。所以'alloc' /'release'给你更好的控制,但是'stringWithFormat'更方便你什么时候会自动释放字符串。 – 2011-03-16 14:12:56

2

考虑使用scrollViewDidEndDecelerating方法来避免频繁更新。 Alloc-init不对性能下降负责,经常设置文本。除非你真的需要不断地改变它(在这种情况下,有计时器的解决方案可能是一个选项),你应该寻找一种不同的钩子方法。

+0

谢谢Thomas我一直都需要它,所以Timer选项看起来不错。 – mtompson 2011-03-16 09:18:23