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,则线程可能会在您 return from 后立即被释放create,因此它没有机会执行选择器。您必须将线程存储到strong实例变量或类似的东西中。

于 2012-07-24T14:38:19.950 回答
8

尝试以这种方式启动线程:

[self performSelectorInBackground:@selector(saySomething) withObject:nil]
于 2012-07-24T14:33:10.840 回答
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 回答
2

谢谢你的回复。这可能是一场虚惊。除了代码中的所有错误之外,我认为示例本身是不正确的。在“创建方法”之后,应用程序立即退出,因此它没有时间从新线程中打印出东西。

这就是我所做的。我从这个链接复制了代码

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

它工作得很好。一旦我删除了“for循环”并只放入了打印语句,新线程就没有输出。所以我在睡眠中添加了,现在我看到了来自新线程的消息。这是新代码。

- (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.

如果我注释掉睡眠,那么我会得到以下输出。

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 回答
0

我同意使用 dispatch_async() 或 performSelectorInBackground 可能是您想要的。但是,就为什么您的代码不产生任何输出而言,方法签名应该只有一个参数。将方法更改为

-(void) saySomething:(id)foo;

并将选择器更改为

selector:@selector(saySomething:)

“要发送到目标的消息的选择器。此选择器只能接受一个参数,并且不能有返回值。” - 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 回答