Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我怎么能?”;“形象化”;(观察)iOS中是否有线程退出?_Ios_Multithreading_Runloop - Fatal编程技术网

“我怎么能?”;“形象化”;(观察)iOS中是否有线程退出?

“我怎么能?”;“形象化”;(观察)iOS中是否有线程退出?,ios,multithreading,runloop,Ios,Multithreading,Runloop,在学习thread and run loop时,我注意到一些文章说:“通常,一个线程在完成其工作后就退出了。”因此,有时有必要使用nsrunlop创建一个所谓的“不朽线程”(?我不知道英语中的确切术语) 问题是,我怎样才能证明“一旦它完成了工作就存在”这句话?我是这样编码的 -(void)dosomethingon线程{ //调度异步(调度获取全局队列(调度队列优先级默认为0)^{ //NSLog(@“我在线程%@,[NSThread currentThread]); // }); NST

在学习thread and run loop时,我注意到一些文章说:“通常,一个线程在完成其工作后就退出了。”因此,有时有必要使用
nsrunlop
创建一个所谓的“不朽线程”(?我不知道英语中的确切术语)

问题是,我怎样才能证明“一旦它完成了工作就存在”这句话?我是这样编码的

-(void)dosomethingon线程{
//调度异步(调度获取全局队列(调度队列优先级默认为0)^{
//NSLog(@“我在线程%@,[NSThread currentThread]);
//    });
NSThread*thread1=[[NSThread alloc]initWithBlock:^{
NSLog(@“我在线程%@,[NSThread currentThread]);
}];
thread1.name=@“thread1”;
[线程1开始];
[[NSNotificationCenter defaultCenter]addObserver:自选择器:@selector(threadExitHandler:)名称:NSThreadWilleExitNotification对象:nil];
}
-(无效)螺纹出口编号:(NSNotification*)noti{
NSLog(@“线程将退出:%@”,noti);
}
嗯,通知处理程序没有被调用


那么,[1]:如何证明线程存在?[2] :什么类型的线程会有这样的行为?(我知道主线程永远不会退出,其他线程呢?
GCD
threads,例如?

如果要可视化它,我可能会使用调试器。例如,我在
NSThread
子类中设置了一个断点,我在Xcode的左面板中看到了线程:

但是如果在
main
方法完成后一秒钟触发另一个断点,我会看到相关的“线程将退出”消息,我的线程不再存在:

或者,您可以在
NSThread
子类的
dealloc
方法中添加
NSLog
语句,这也将演示其释放。或者在调试内存对象图中查找子类


嗯,通知处理程序没有被调用

我建议您在开始线程之前添加您的观察者。现在,在这个线程的开始和退出以及添加观察者之间有一个竞争条件。FWIW,我确实看到了“线程将退出”消息

虽然了解线程和运行循环很好,但它现在几乎没有实际用途。掌握GCD可能更有用,它使我们摆脱了线程的杂草,并为编写健壮的多线程代码提供了性能优化和更丰富的API


关于GCD是否创建持久性线程,答案是肯定的,但我们对这个细节进行了抽象。但GCD的性能优化之一是它为我们管理一个“线程池”,而不是不断地旋转新线程,并不断地为每个调度的代码块销毁它们

你可能想看2016年的WWDC。它遍历队列、线程和运行循环之间的关系