我有一个更新程序中标签的计时器,当有用户交互(如手指向下或滚动)时,计时器暂停。我正在使用此代码来修复它并且它可以工作,但它似乎重新创建了内存分配,导致游戏在几分钟内崩溃。
-(void) timeChangerInitNormal {
if (running == YES)
if ( _timerQueue ) return;
_timerQueue = dispatch_queue_create("timer queue", 0);
dispatch_async(_timerQueue, ^{
timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timeChanger) userInfo:nil repeats:YES];
while ( [timer isValid] ) {
[[NSRunLoop currentRunLoop] runUntilDate:[[NSDate date] dateByAddingTimeInterval:5.0]];
}
});
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
{
[self _lockInteraction];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
[self _unlockInteraction];
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
[self _lockInteraction];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale;
{
[self _unlockInteraction];
}
- (void) _lockInteraction
{
[self _setControls:_staticViews interacted:NO];
[self _setControls:_autoLayoutViews interacted:NO];
}
- (void) _unlockInteraction
{
[self _setControls:_staticViews interacted:YES];
[self _setControls:_autoLayoutViews interacted:YES];
}
- (void) _setControls:(NSArray *)controls interacted:(BOOL)interacted
{
for ( UIControl *control in controls ) {
if ( [control isKindOfClass:[UIControl class]]) {
control.userInteractionEnabled = interacted;
}
}
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
[self _updatePositionForViews:_autoLayoutViews];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self _updatePositionForViews:_autoLayoutViews];
}
- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView;
{
return _mapImageView;
}
答案 0 :(得分:1)
TL;博士
您只想使用普通计时器。创建后,将其添加到事件跟踪模式:
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
这将使其在跟踪事件时触发(触摸滑块,滚动视图,......)。
如果您仍想知道:您创建的线程基本上使CPU在while循环中保持旋转,从而创建自动释放的NSDate
对象。由于没有内部自动释放池,因此未释放日期对象。
但是不要试图修复你的旧代码。还有更多问题。