NSThread, NSTimer e AutoreleasePools em um aplicativo do iPhone SDK

votos
1

Eu quero criar um Appilication no iPhone em que eu quero usar NSThread. Eu criei um segmento usando

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

Quero que o meu um thread irá lidar com todos os toques e outra interação do usuário e o segundo segmento lidar com o NSTimer. Assim, em doThread () Eu tenho alocar NSTimer como,

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

}

Agora eu não posso capaz de chamar o método NoCronômetro de NSTimer. Mas eu posso ver o depois timer impressa nas log.Is que qualquer coisa que eu não posso usar o NSTimer dentro do segmento?

Esta é também posso obter enquanto a execução.

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

Por favor me ajude para isso. Obrigado.

Publicado 27/08/2009 em 05:46
fonte usuário
Em outras línguas...                            


2 respostas

votos
7

NSTimerprogramações de seus eventos de tempo no atual NSRunLoopfaz rosca --Sua não iniciar um.

Se tudo que você está tentando fazer é executar algo após um determinado período de tempo, use -[NSObject performSelector:withObject:afterDelay:]:

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

Se você está tentando realmente fazer um trabalho em segundo plano, +[NSThread detachNewThreadSelector:toTarget:withObject:]funcionará como esperado, mas você não deve executar eventos do temporizador em segundo plano, sem um NSRunLoop. Além disso, você vai precisar para embrulhar o seu código em uma piscina disparo automático:

- (void)doThread:(NSString *)poststring
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     // Your code goes in here
     [pool drain];
}
Respondeu 27/08/2009 em 06:01
fonte usuário

votos
0

Eu não tenho certeza se entendi sua pergunta sobre o método NoCronômetro. você pode reformulá-lo?

Quanto a:

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

Algumas coisas podem causar isso:

Se você não está delegando ou subclassificação um objeto UIApplication, você não terá uma piscina disparo automático no lugar e teria que criar uma em seu próprio país. No entanto, a resposta certa, nesse caso, é só para ter certeza que você está usando UIApplication corretamente.

Neste caso, no entanto, desde que você está destacando o segmento, que é provável que a causa do erro. tópicos destacados não têm piscinas disparo automático, por isso você tem que criar o seu próprio.

Consulte a documentação:

Piscinas disparo automático

Respondeu 27/08/2009 em 06:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more