Objective C +如何创建新线程并向其发布消息

时间:2012-07-24 14:27:57

标签: objective-c multithreading

我在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]; 
 }

但看起来这个方法似乎没有被调用。控制台中没有任何内容打印出来。

6 个答案:

答案 0 :(得分:10)

您确定要显式线程控制吗?很可能你没有。 GCD怎么样?

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

至于你的问题,如果你使用ARC,那么线程可能会在你从create返回后立即释放,因此它没有机会执行选择器。您必须将线程存储到strong实例变量或类似的东西中。

答案 1 :(得分:8)

尝试以这种方式启动一个帖子:

[self performSelectorInBackground:@selector(saySomething) withObject:nil]

答案 2 :(得分: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]; 
 }

答案 3 :(得分:1)

感谢您的回复。这可能是一个误报。除了代码中的所有错误,我认为样本本身并不正确。在“创建方法”之后,应用程序立即退出,因此它没有任何时间从新线程中打印出来的东西。

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

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

它工作正常。一旦我删除'for loops'并输入just 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.

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

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

Debugger stopped.
Program exited with status value:0.

谢谢

答案 4 :(得分:0)

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

-(void) saySomething:(id)foo;

并将选择器更改为

selector:@selector(saySomething:)

“要发送到目标的消息的选择器。此选择器必须只接受一个参数,并且不能有返回值。” - NSThread Docs

答案 5 :(得分:-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" );

 }