先寫解決辦法
1.
NStimer * timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
將定時器加入到循環機制中
[[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];
2.
使用GCD創建定時器。GCD創建定時器不收Runloop的影響,并且GCD的定時器更精準。
原因
1.當tableView和scrollView滑動的時候 定時器的時間不響應 是蘋果的響應機制的原因
詳解看http://blog.csdn.net/meegomeego/article/details/48547583
2.有關NSTimer的創建方式,NSTimer的創建方法有兩種
NSTimer * timer = [NSTimerscheduled TimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
或者
NSTimer * timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
注意: 1.使用NSTimerscheduled 的初始化方法將以默認mode(NSDefaultRunLoopMode)直接添加到runloop中
2.不用scheduled方式初始化的,需要手動addTimer:forMode:將timer添加到一個runloop中(一般也會將Mode設置為NSDefaultRunLoopMode)。
關于runloop的知識:其實就是runloop的mode在做怪。runloop可以理解為cocoa下的一種消息循環機制,用來處理各種消息事件,我們在開發的時候并不需要手動去創建一個runloop,因為框架為我們創建了一個默認的runloop,通過[NSRunloop currentRunloop]我們可以得到一個當前線程下面對應的runloop對象,不過我們需要注意的是不同的runloop之間消息的通知方式。在開啟一個NSTimer或CADisplayLink實質上是在當前的runloop中注冊了一個新的事件源,而當scrollView滾動的時候,當前的MainRunLoop是處于UITrackingRunLoopMode的模式下,在這個模式下,是不會處理NSDefaultRunLoopMode的消息(因為RunLoop Mode不一樣),要想在scrollView滾動的同時也接受其它runloop的消息,就不能將Mode參數設置為
NSDefaultRunLoopMode,而應該設置為NSRunLoopCommonModes。