objective-c - Objective-C线程

标签 objective-c multithreading

我想了解有关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/

相关文章:

objective-c - 设置绑定(bind)属性时观察 NSUserDefaultsController 不工作

c++ - 在 C++ 中使用 OpenMP 并行化算法

iphone - 创建对象 - Objective-C

objective-c - 搜索 int 或 double 的 NSArray

ios - 禁用 UIScrollView 向特定方向拖动事件并将事件发送到 super

objective-c - NSDateFormatter 失败,字符串看起来正确

c++ - 使用 pthread 唤醒多线程的最佳方法

python - 使用python在MySQL中多线程插入数据

c# - 在 Parallel.ForEach 中指定默认的 MaxDegreeOfParallelism?

java - volatile 变量 'reads' 与正常读取一样快吗?