我想了解有关Objective-C中线程的更多信息,所以我制作了一个小的测试程序,该程序仅循环并输出循环的迭代次数。
但是,我得到的输出不是我期望的。我对为什么有一个想法,但是首先这是我的代码:
主目录
#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Car* myCar = [[Car new] autorelease];
[myCar performSelectorInBackground:@selector(LoopAndSay) withObject:nil];
for(int i = 0; i < 100; i++ )
{
NSLog(@"Main loop on %i", i);
}
}
return 0;
}
汽车
#import "Car.h"
@implementation Car
@synthesize name, model;
-(void) LoopAndSay {
for(int i = 0; i < 100; i++)
{
NSLog(@"Looping for the %i time", i);
}
}
@end
现在,如果我按原样运行它,则后台循环有时将无法完成(在迭代94和97之间停止)。另外,如果我切换代码,以便直到主线程循环之后才调用后台循环,则它将不会运行任何迭代。
这是因为主线程完成了,并且不想等待后台线程运行完成吗?如果是这种情况,是否有办法强制程序继续运行,直到主线程和任何后台线程都完成?
最佳答案
这几乎可以肯定是因为您在线程完成之前退出了自动释放池的作用域,而main
函数在后台线程完成之前返回了。尝试在结尾处添加sleep(3)
或其他内容,看看您的后台线程是否完成。
在Mac OS X上,所有“前台”线程都已完成时,进程终止。 peformSelectorInBackground:
仅创建一个后台线程,因此,一旦main
返回,您将没有前台线程,并且您的进程将终止。
关于objective-c - Objective-C线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886509/