Objective-C线程:退出线程,保留问题

时间:2011-02-23 08:19:10

标签: objective-c multithreading cocoa

我正在尝试创建一个线程来配置运行循环,以通过定义的NSTimer运行物理引擎。但是,我无法正常退出线程(或者我认为问题是这样)。

附上我的代码的相关部分:

(此代码位于视图控制器中) (按下按钮时调用后退)

- (void)back {

    [timestep invalidate];
    exiting = YES;

    [self release];

}

- (void)initializePhysicsWorld {

    // Initializes the thread to simulate physics interactions.
    [NSThread detachNewThreadSelector:@selector(physicsThreadMethod)
                             toTarget:self
                           withObject:nil];
}

- (void)physicsThreadMethod {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop];

    timestep = [NSTimer timerWithTimeInterval:1.0f/60.0f
                                       target:self
                                     selector:@selector(step:)
                                     userInfo:nil
                                      repeats:YES];

    [myRunLoop addTimer:timestep forMode:NSDefaultRunLoopMode];

    while (!exiting) {

        CFRunLoopRun();

        [pool release];
        pool = [[NSAutoreleasePool alloc] init]; // periodically refreshes pool
    }
    CFRunLoopStop([myRunLoop getCFRunLoop]);
    NSLog(@"Thread is going to exit");
    [pool release];

}

- (void)dealloc {
    if ([self.view superview]) {
        [self.view removeFromSuperview];
    }

    [super dealloc];
}

引擎(步骤:函数)运行正常,但是当我尝试通过运行该方法来退出循环时,似乎线程不会在我的视图控制器上释放它的保留(不调用dealloc)。我认为我的线程没有退出physicsThreadMethod方法,因为NSLog没有出现在控制台中。只有当我第二次跑回'时才叫到Dealloc。

我不确定为什么会这样,所以我真的很感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

问题出在这里:

while (!exiting) {

    CFRunLoopRun(); //<-- here you start the run loop.
    // the lines under this line are NEVER executed. also the while loop does nothing
    [pool release];
    pool = [[NSAutoreleasePool alloc] init]; // periodically refreshes pool
}

您可以使用NSOperations来包装您的工作,已经在此类中定义了属性以完成此类操作。

如果您想在NSThread中坚持实施,则必须查看CFRunLoop reference以及如何将观察者添加到运行循环中。

答案 1 :(得分:0)

CFRunLoopRun是否会返回每一步:? CFRunLoopStop或[myRunLoop runUntilDate:]会有所帮助。