NSDate导致2GB的内存分配

时间:2012-11-27 19:28:20

标签: objective-c

我有一个更新程序中标签的计时器,当有用户交互(如手指向下或滚动)时,计时器暂停。我正在使用此代码来修复它并且它可以工作,但它似乎重新创建了内存分配,导致游戏在几分钟内崩溃。

-(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;
}

1 个答案:

答案 0 :(得分:1)

TL;博士

您只想使用普通计时器。创建后,将其添加到事件跟踪模式:

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];

这将使其在跟踪事件时触发(触摸滑块,滚动视图,......)。

如果您仍想知道:您创建的线程基本上使CPU在while循环中保持旋转,从而创建自动释放的NSDate对象。由于没有内部自动释放池,因此未释放日期对象。

但是不要试图修复你的旧代码。还有更多问题。