NSThread, AsyncSocket и освобождение объекта

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

[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, невозможно освободить и освободить этот объект, пока сокет не отключится.

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


person esad    schedule 17.02.2010    source источник
comment
Так в чем проблема? Я предполагаю, что поскольку поток запускает workerLoop, который является частью сохраненного объекта, вы не хотите освобождать его до завершения потока.   -  person stefanB    schedule 17.02.2010
comment
Не используйте имена методов, начинающиеся с подчеркивания. Apple заявила, что префикс подчеркивания зарезервирован только для Apple.   -  person dreamlax    schedule 17.02.2010
comment
Зачем вам нужно планировать его во вторичном потоке? Название класса говорит о том, что он асинхронный; это не похоже на то, что вы собираетесь сидеть заблокированным на нем. Решение может состоять в том, чтобы просто запланировать его в основном потоке. Вы можете использовать очередь операций или очередь отправки, если вам абсолютно необходимо реагировать на входящие события в потоке; когда что-то происходит, поставьте в очередь операцию или блок для ее обработки.   -  person Peter Hosey    schedule 17.02.2010
comment
Причина, по которой мне нужен вторичный цикл, заключается в том, что пока основной цикл обрабатывает события пользовательского интерфейса (которые в моем приложении будут очень частыми), сокет блокируется.   -  person esad    schedule 17.02.2010


Ответы (1)


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

person esad    schedule 17.02.2010