Objective c NSThread、AsyncSocket和对象解除分配

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断开连接时终止,因此在套接字断开连接之前,不可能释放和

我有一段使用AsyncSocket的网络代码,但将其移动到一个单独的runloop。我使用以下代码创建此runloop:

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