NSThread, AsyncSocket и освобождение объекта - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть фрагмент сетевого кода, который использует AsyncSocket, но перемещает его в отдельный цикл запуска. Я создаю этот runloop со следующим фрагментом кода:

[NSThread detachNewThreadSelector:@selector(_workerLoop) toTarget:self withObject:nil];

и вот как выглядит мой _workerLoop (они оба в одном классе):

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

Теперь, согласно документам, NSThread сохранит цель, и, поскольку этот поток будет завершен только при отключении AsyncSocket, невозможно освободить и освободить этот объект, пока не отключится сокет.

Как я могу это исправить или, может, я что-то не так делаю?

1 Ответ

0 голосов
/ 17 февраля 2010

Я решил это путем рефакторинга конструктора runloop в собственный класс, на который ссылается родительский класс, который обрабатывает сетевой код. Таким образом, родительский объект освобождается, он может остановить поток и освободить runloop

...