我正在尝试创建一个线程来配置运行循环,以通过定义的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。
我不确定为什么会这样,所以我真的很感激任何帮助。谢谢!
答案 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:]会有所帮助。