2

Objective C で新しいスレッドを作成するのに問題があります

- (void) create
{
     NSLog( @"Hello World from create \n" );
     NSThread* evtThread = [ [NSThread alloc] initWithTarget:self
                            selector:@selector( saySomething )
                          object:nil ];

    [ evtThread start ];
}

 - (void) saySomething
 {
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    printf( "Hello world from new thread \n");
    NSLog( @"Hello World from new thread \n" );
    //[pool release]; 
 }

しかし、メソッド saySomething が呼び出されていないようです。コンソールには何も出力されません。

4

6 に答える 6

12

明示的なスレッド制御が必要ですか? ほとんどの場合、そうではありません。GCDはどうですか?

- (void) create
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self saySomething];
    });
}

あなたの問題に関しては、ARC を使用する場合、おそらく から戻った直後にスレッドが解放さcreateれるため、セレクターを実行する機会がありません。スレッドをstrongインスタンス変数などに格納する必要があります。

于 2012-07-24T14:38:19.950 に答える
8

この方法でスレッドを開始してみてください。

[self performSelectorInBackground:@selector(saySomething) withObject:nil]
于 2012-07-24T14:33:10.840 に答える
2

ご回答ありがとうございます。これは誤報だった可能性があります。コードのすべての間違いは別として、サンプル自体が正しくなかったと思います。「メソッドの作成」の直後にアプリケーションが終了するため、新しいスレッドからのものを出力する時間がありませんでした。

これが私がしたことです。このリンクからコードをコピーしました

http://softpixel.com/~cwright/programming/threads/threads.cocoa.php

そしてそれはうまくいきました。「for ループ」を削除して print ステートメントだけを挿入するとすぐに、新しいスレッドからの出力はありませんでした。だから私はスリープ状態で追加し、今では新しいスレッドからのメッセージが表示されます. これが新しいコードです。

- (void) create
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [NSThread detachNewThreadSelector:@selector(aMethod:) toTarget:[Activ class]     
    withObject:nil];
    NSLog( @"Hello from create. \n" ); 
    sleep(1);
    [pool release]; 
}

+(void)aMethod:(id)param
{
    NSLog( @"Hello from new thread. \n" );
}

これにより、次の出力が得られます。

Running…
2012-07-24 11:21:32.769 [2065:20f] Hello from new thread. 
2012-07-24 11:21:32.769 [2065:a0f] Hello from create. 

Debugger stopped.
Program exited with status value:0.

sleep をコメントアウトすると、次の出力が得られます。

Running…
2012-07-24 11:21:23.080 [2038:a0f] Hello from create. 

Debugger stopped.
Program exited with status value:0.

ありがとう

于 2012-07-24T16:45:29.810 に答える
2
- (void) create
{
     NSLog( @"Hello World from create \n" );
    [self performSelectorInBackground:@selector(saySomething) withObject:nil];
}


- (void) saySomething
 {
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    printf( "Hello world from new thread \n");
    NSLog( @"Hello World from new thread \n" );
    //[pool release]; 
 }
于 2012-07-24T14:32:31.163 に答える
0

dispatch_async() または performSelectorInBackground を使用することは、おそらくあなたが望むものであることに同意します。ただし、コードが出力を生成しない理由については、メソッド シグネチャに引数を 1 つだけ指定する必要があります。メソッドを次のように変更します

-(void) saySomething:(id)foo;

セレクターを

selector:@selector(saySomething:)

"ターゲットに送信するメッセージのセレクター。このセレクターは引数を 1 つだけ受け取る必要があり、戻り値を持たない必要があります。" - NSThread ドキュメント

于 2012-07-24T15:24:54.590 に答える
-1

以下の方法でお試しください。

- (void) create
{
     NSLog( @"Hello World from create \n" );

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

}

 - (void) saySomething
 {

    printf( "Hello world from new thread \n");
    NSLog( @"Hello World from new thread \n" );

 }
于 2013-06-26T06:04:37.087 に答える