NSThread, NSTimer a AutoreleasePools v aplikaci iPhone SDK

hlasů
1

Chci vytvořit appilication v iPhone, ve kterém chci použít NSThread. Vytvořil jsem jedno vlákno pomocí

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

Chci, aby moje jedno vlákno bude zpracovávat všechny doteky a další interakci s uživatelem a druhá nit zvládnout NSTimer. Takže v doThread () mám přidělit NSTimer podobně,

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

}

Teď nemohu schopen volání metody OnTimer z NSTimer. Ale vidím, „after časovače“ tištěný v log.Is, že vše, co nemohu používají NSTimer ve vlákně?

To je také mohu dostat, zatímco provedení.

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

Prosím, pomozte mi za to. Děkuji.

Položena 27/08/2009 v 05:46
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
7

NSTimernaplánuje její čas události na aktuální NSRunLoop--your závitu nespustí jeden.

Je-li vše, co se snaží dělat něco běžet po určitou dobu, použijte -[NSObject performSelector:withObject:afterDelay:]:

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

Pokud se snažíte, aby skutečně dělat práci na pozadí, +[NSThread detachNewThreadSelector:toTarget:withObject:]bude fungovat podle očekávání, ale neměli byste spouštět událostí časovače v pozadí, aniž by NSRunLoop. Také budete muset zabalit kód autorelease bazénu:

- (void)doThread:(NSString *)poststring
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     // Your code goes in here
     [pool drain];
}
Odpovězeno 27/08/2009 v 06:01
zdroj uživatelem

hlasů
0

Nejsem si jistý, chápu vaši otázku ohledně způsobu OnTimer. Můžeš to zopakovat?

Co se týče:

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

Pár věcí, které mohou způsobit toto:

Pokud si nejste delegují nebo podtřídy objektu UIApplication, nebudete mít autorelease bazénu na místě a budou muset vytvořit na vlastní pěst. Nicméně, je správná odpověď v tomto případě je jen aby se ujistili, že jste správně pomocí UIApplication.

V tomto případě se však, protože jste odpojení nit, že je pravděpodobné, že příčinou chyby. Oddělené závity nemají autorelease bazény, takže budete muset vytvořit svůj vlastní.

Naleznete v dokumentaci:

autorelease Bazény

Odpovězeno 27/08/2009 v 06:00
zdroj uživatelem

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