Cocoa 更改重复计时器的NSTimer间隔

Cocoa 更改重复计时器的NSTimer间隔,cocoa,macos,timer,Cocoa,Macos,Timer,我正在Cocoa中运行一个mainLoop,使用如下设置的NSTimer: mainLoopTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/fps target:self selector:@selector(mainloop) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:mainLoopTimer forMode:NSEventTr

我正在Cocoa中运行一个mainLoop,使用如下设置的NSTimer:

        mainLoopTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/fps target:self selector:@selector(mainloop) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:mainLoopTimer forMode:NSEventTrackingRunLoopMode];
在程序启动时,我将时间间隔设置为0.0,以便主循环尽可能快地运行。无论如何,我想提供一个函数,在运行时将帧速率(以及计时器的时间间隔)设置为特定值。不幸的是,据我所知,这意味着我必须重新初始化计时器,因为Cocoa不提供类似“setTimerInterval”的函数 这就是我所尝试的:

    - (void)setFrameRate:(float)aFps
{
    NSLog(@"setFrameRate");
    [mainLoopTimer invalidate];
    mainLoopTimer = nil;

    mainLoopTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/aFps target:self selector:@selector(mainloop) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:mainLoopTimer forMode:NSEventTrackingRunLoopMode];
}
但这会引发以下错误并停止主循环:

2010-06-09 11:14:15.868我的目标[7313:a0f]设置帧率 2010-06-09 11:14:15.868我的目标[7313:a0f]*\uu nsautoreleasenpool():类的对象0x40cd80在没有池的情况下自动释放-只是泄漏 2010-06-09 11:14:15.869我的目标[7313:a0f]*\uu NSFTimer类的对象0x40e700在没有池的情况下自动释放-只是泄漏 0.614628

我还尝试使用“retain”关键字重新创建计时器,但这并没有改变任何事情。 关于如何在运行时动态更改NSTimer的间隔,有什么想法吗


谢谢

不应释放mainLoopTimer。
创建该实例时,您收到一个自动释放的实例,并且运行循环保留对该实例的引用。
当您从循环中删除它时,它将被释放:如果您手动释放它,它将被删除,运行循环将尝试访问无效对象。
这就是它崩溃的原因

编辑: 我完全误读了,我以为我看到了发布时,它是一个无效的,对不起。 问题似乎是没有自动释放池。 这通常在main()中完成:首先创建自动释放池

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
并在退出main之前释放它


查看自动释放池文档。

您可以尝试取消注册以前的计时器,并以不同的频率启动新的计时器。 您可以通过取消注册

[yourOldTimer invalidate];
yourOldTimer = nil;

这可能会解决问题。

我知道,这条线非常古老! 但我也在搜索功能

事实证明,由于NSTimes不提供此功能,我决定构建一个自己的。 这不是最好的解决方案,但对我来说,这是唯一可能的

我在标题中定义了变量“BOOL keepOn;”

-(IBAction)doSomething:(id)sender
{
    // Any action to throw every interval.
}

-(IBAction)switchAutoLoad:(id)sender
{
    if([autoLoad state] == NSOffState)
    {
        NSLog(@"auto-reload on!");

        self performSelector:@selector(fireTimer) withObject:nil afterDelay:0];
        keepOn = YES;
        [autoLoad setState:NSOnState];
    }
    else
    {
        NSLog(@"auto-reload off!");
        keepOn = NO;
        [autoLoad setState:NSOffState];
    }
}

-(void)fireTimer
{
    [self doSomething:nil];

    float theTime = 20; // This is the time interval.

    if(keepOn)
    {
        [self performSelector:@selector(fireTimer) withObject:nil afterDelay:theTime];
    }
}
(非常)bis的问题是,“计时器”在获得新值之前正在等待整个延迟。 你看,它反应不快:)) 你不能立即停止(必须等待延迟结束)

如果你停止它,它就会像你想象的那样再抛出一个动作


实际上,它适用于我的,适用于小应用程序和工具。

我应该做些什么来改变间隔?请原谅。我误读了[mainLoopTimer release]。您的计时器工作正常,但似乎没有自动释放池。看看这里:嗯,我已经准备好把自动释放池放在适当的位置,但是没有用,但我会再试一次!好的,如果我放置一个自动释放池,并像这样初始化计时器:mainLoopTimer=[[NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(mainloop)userInfo:nil repeats:YES]autorelease];它不会抛出泄漏错误,但应用程序会被中断。还有其他想法吗?没有,只是GDB:打断了,我很确定问题是我覆盖了计时器。没有其他方法来设置间隔吗?如你所见,这就是我所做的一切准备就绪,但它不起作用。