NSThread, NSTimer и AutoreleasePools в приложении iPhone SDK - PullRequest
1 голос
/ 27 августа 2009

Я хочу создать приложение в iPhone, в котором я хочу использовать NSThread. Я создал одну тему, используя

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

Я хочу, чтобы один мой поток обрабатывал все касания и другие действия пользователя, а второй поток обрабатывал NSTimer. Итак, в doThread () я должен выделить NSTimer как,

-(void) doThread:(NSString *)poststring {

    NSLog(@"create thread:");

    [lock lock];
    T1 = [NSTimer scheduledTimerWithTimeInterval:(5)            
     target : self
     selector:@selector(onTimer)
     userInfo : nil
     repeats : YES];
     NSLog(@"after timer");

    usleep(1);
    [lock unlock];
}

In onTImer,

-(void)onTimer

{
    NSLog(@"in timer");

}

Теперь я не могу вызвать метод onTimer NSTimer. Но я могу видеть «таймер после», напечатанный в журнале. Что-нибудь, что я не могу использовать NSTimer в потоке?

Это также я могу получить во время исполнения.

NSAutoreleaseNoPool(): Object 0xd15880 of class __NSCFDate autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x30525acf 0x27b5 0x3050a79d 0x3050a338 0x926ae155 0x926ae012)

Пожалуйста, помогите мне в этом. Спасибо.

Ответы [ 2 ]

7 голосов
/ 27 августа 2009

NSTimer планирует свои временные события для текущего NSRunLoop - ваш поток не запускает один.

Если все, что вы пытаетесь сделать, это запустить что-то через определенное время, используйте -[NSObject performSelector:withObject:afterDelay:]:

[self performSelector:@selector(onTimer) withObject:nil afterDelay:5.0f];

Если вы на самом деле пытаетесь работать в фоновом режиме, +[NSThread detachNewThreadSelector:toTarget:withObject:] будет работать, как и ожидалось, но вы не должны запускать события таймера в фоновом режиме без NSRunLoop. Кроме того, вам нужно будет обернуть ваш код в пул авто-релизов:

- (void)doThread:(NSString *)poststring
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     // Your code goes in here
     [pool drain];
}
0 голосов
/ 27 августа 2009

Я не уверен, что понимаю ваш вопрос о методе onTimer. Вы можете это переформулировать?

Что касается:

NSAutoreleaseNoPool(): Object 0xd15880 of class __NSCFDate autoreleased with no pool in place - just leaking 

Это может быть вызвано несколькими причинами:

Если вы не делегируете или не наследуете объект UIApplication, у вас не будет пула автоматического выпуска, и вам придется создавать его самостоятельно. Однако правильный ответ в этом случае - просто убедиться, что вы правильно используете UIApplication.

В этом случае, однако, поскольку вы отсоединяете поток, это, вероятно, является причиной ошибки. Отдельные темы не имеют пулов автоматического выпуска, поэтому вам придется создавать свои собственные.

См. Документацию:

Автозапуск бассейнов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...