2009-08-27 17 views
1

iPhoneでNSThreadを使用したいappilicationを作成したいと思います。私は一つのスレッドは、すべてのタッチと他のユーザーとの対話とNSTimerを扱う第二のスレッドを処理することを望むiPhone SDKアプリケーションのNSThread、NSTimer、およびAutoreleasePool

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

を使用してスレッドを1つ作成しました。だから、doThread()で、私は

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

} 

は、今私はNSTimerのにOnTimerメソッドを呼び出すことができない、などのNSTimerを割り当てています。しかし、私は、ログ内に印刷された "after timer"を見ることができます。スレッド内でNSTimerを使用できないものは何ですか?

これは実行中に取得することもできます。

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

私を助けてください。 ありがとうございます。

+1

あなたはおそらく、私たちにあなたがタッチを扱うほとんどのアプリが必要がない場合、このようなマルチスレッドのアプローチを持ちたい理由についてもう少し教えてくださいそのような長さに行く。 – mahboudz

答えて

0

私はあなたのonTimerメソッドについてのご質問が分かりません。あなたはそれを言い返すことができますか?

について:

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

いくつかのことは、これを引き起こす可能性があります:あなたは委任かのUIApplicationオブジェクトをサブクラス化していない場合

、あなたが代わりに自動解放プールを持っていないだろうとしていますあなた自身で作成することができます。しかし、その場合の正しい答えは、UIApplicationを正しく使用していることを確認することです。

ただし、スレッドを切り離しているため、エラーが発生している可能性があります。分離されたスレッドには自動解放プールがないため、独自のスレッドを作成する必要があります。現在NSRunLoop --yourのスレッドが1つを起動しないで

Autorelease Pools

7

NSTimerスケジュールの時間イベント:

は、マニュアルを参照してください。

あなたがやろうとしているすべてが実行された場合に一定時間後に何か、-[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]; 
} 
関連する問題