注册 登录
主题 : 求问常驻线程怎么销毁。。
级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 91
可可豆: 302 CB
威望: 302 点
在线时间: 416(时)
注册时间: 2015-12-20
最后登录: 2018-10-02
0 楼:  发表于: 2018-03-22 15:58    发自: Web Page
来源于 一般提问 分类

求问常驻线程怎么销毁。。   

在一个页面用给Runloop添加一个Port的方式开启了一个常驻线程,然后此页面Pop回去后发现这个线程还在工作。。。
级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 91
可可豆: 302 CB
威望: 302 点
在线时间: 416(时)
注册时间: 2015-12-20
最后登录: 2018-10-02
1 楼:  发表于: 2018-03-22 16:00    发自: Web Page
补充,我在销毁页面的时候用了[self.thread cancel]方法但是不起作用
级别: 版主

状态: 连续签到 - [309天]
UID: 559669
精华: 0
发帖: 1350
可可豆: 3463 CB
威望: 3335 点
在线时间: 2272(时)
注册时间: 2016-04-25
最后登录: 2019-03-22
2 楼:  发表于: 2018-03-22 16:04    发自: Web Page
我只会gcd的,creat完记得release
没有什么事情是一台GUNDAM解决不了的,如果有,那就两台.
级别: 精灵王

状态: 连续签到 - [80天]
UID: 510329
精华: 0
发帖: 767
可可豆: 1176 CB
威望: 1013 点
在线时间: 1128(时)
注册时间: 2015-09-30
最后登录: 2019-03-22
3 楼:  发表于: 2018-03-22 17:00    发自: Web Page
做这个线程控制可以用 NSOperation
级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 91
可可豆: 302 CB
威望: 302 点
在线时间: 416(时)
注册时间: 2015-12-20
最后登录: 2018-10-02
4 楼:  发表于: 2018-03-22 17:06    发自: Web Page
完整代码如下:

#import "SecondController.h"

@interface SecondController ()
@property (nonatomic,strong) NSThread *thread;
@end

@implementation SecondController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
    [self.thread start];
}
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [self.thread cancel];
    self.thread = nil;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self performSelector:@selector(action) onThread:self.thread withObject:nil waitUntilDone:NO ];
}
- (void)run{
    @autoreleasepool {
        [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    }
}
-(void)action{
    while (1) {
        NSLog(@"1");
    }
}
-(void)dealloc{
    NSLog(@"%d,%s",__LINE__,__func__);
}
@end


现在我从SecondController这个控制器Pop回上个控制器,尽管我把self.thread的任务cancel了也置为nil了,但是控制台可以看到NSLog(@"1");一直在执行,而且SecondController也没有释放
级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 91
可可豆: 302 CB
威望: 302 点
在线时间: 416(时)
注册时间: 2015-12-20
最后登录: 2018-10-02
5 楼:  发表于: 2018-03-22 17:08    发自: Web Page
回 3楼(564282030) 的帖子
像我4楼这样用NSThread怎么弄嘞,NSOperation的常驻线程还没试过
级别: 精灵王

状态: 连续签到 - [80天]
UID: 510329
精华: 0
发帖: 767
可可豆: 1176 CB
威望: 1013 点
在线时间: 1128(时)
注册时间: 2015-09-30
最后登录: 2019-03-22
6 楼:  发表于: 2018-03-22 17:12    发自: Web Page
你这样self.thread不一定是你的常驻线程,也没有这样用NSTread的
级别: 精灵王

状态: 连续签到 - [447天]
UID: 566298
精华: 0
发帖: 845
可可豆: 3610 CB
威望: 2678 点
在线时间: 2151(时)
注册时间: 2016-06-01
最后登录: 2019-03-22
7 楼:  发表于: 2018-03-22 17:15    发自: Web Page
[[NSRunLoop currentRunLoop]removePort:port forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop]run];

级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 91
可可豆: 302 CB
威望: 302 点
在线时间: 416(时)
注册时间: 2015-12-20
最后登录: 2018-10-02
8 楼:  发表于: 2018-03-22 17:32    发自: Web Page
回 7楼(雨秋爱吃鱼) 的帖子
添加到哪,我试了貌似没用。。
级别: 精灵王

状态: 连续签到 - [447天]
UID: 566298
精华: 0
发帖: 845
可可豆: 3610 CB
威望: 2678 点
在线时间: 2151(时)
注册时间: 2016-06-01
最后登录: 2019-03-22
9 楼:  发表于: 2018-03-22 17:36    发自: Web Page
回 8楼(Gerrard888) 的帖子
理解一下就行了,就是解除你常驻子线程的runloop对NSPort的监听。
我试了好几次都是可以的

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部