我在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];
}
但看起来这个方法似乎没有被调用。控制台中没有任何内容打印出来。
答案 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" );
}