Objective c NSThread、AsyncSocket和对象解除分配
我有一段使用AsyncSocket的网络代码,但将其移动到一个单独的runloop。我使用以下代码创建此runloop:Objective c NSThread、AsyncSocket和对象解除分配,objective-c,cocoa,nsthread,asyncsocket,nsrunloop,Objective C,Cocoa,Nsthread,Asyncsocket,Nsrunloop,我有一段使用AsyncSocket的网络代码,但将其移动到一个单独的runloop。我使用以下代码创建此runloop: [NSThread detachNewThreadSelector:@selector(_workerLoop) toTarget:self withObject:nil]; 下面是我的workerLoop的样子(它们都在同一个类中): 现在,根据文档,NSThread将保留目标,并且由于此线程仅在AsyncSocket断开连接时终止,因此在套接字断开连接之前,不可能释放和
[NSThread detachNewThreadSelector:@selector(_workerLoop) toTarget:self withObject:nil];
下面是我的workerLoop的样子(它们都在同一个类中):
现在,根据文档,NSThread将保留目标,并且由于此线程仅在AsyncSocket断开连接时终止,因此在套接字断开连接之前,不可能释放和释放此对象
我如何修复这个问题,或者可能我做错了什么?我已经通过将runloop构造函数重构到自己的类中解决了这个问题,该类由处理网络代码的父类引用。这样,父对象被解除分配时,它可以停止线程并释放runloop那么问题出在哪里?我假设由于线程运行workerLoop,而workerLoop是保留对象的一部分,因此您不希望在线程完成之前释放它。请不要使用以下划线开头的方法名。苹果已经声明下划线前缀仅为苹果保留。为什么需要将其安排在辅助线程上?类的名称表示它是异步的;你又不是要坐在那里。解决方案可能只是在主线程上调度它。如果绝对需要响应线程上的传入事件,则可以使用操作队列或调度队列;当某些事情发生时,将操作或块排队以处理它。我需要二次循环的原因是,当主循环处理UI事件时(在我的应用程序中,UI事件将非常频繁),套接字被阻止
-(void)_workerLoop {
workerLoop = [[NSRunLoop currentRunLoop] retain];
while(keepWorkerLoopRunning) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[workerLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.5f]];
[pool release];
}
[workerLoop release];
workerLoop = nil;
}