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

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

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

状态: 连续签到 - [234天]
UID: 559669
精华: 0
发帖: 1029
可可豆: 2642 CB
威望: 2180 点
在线时间: 1547(时)
注册时间: 2016-04-25
最后登录: 2018-06-25
2 楼:  发表于: 2018-03-22 16:04    发自: Web Page
我只会gcd的,creat完记得release
没有什么事情是一台GUNDAM解决不了的,如果有,那就两台.
级别: 圣骑士
状态: 连续签到 - [62天]
UID: 510329
精华: 0
发帖: 489
可可豆: 801 CB
威望: 673 点
在线时间: 839(时)
注册时间: 2015-09-30
最后登录: 2018-06-25
3 楼:  发表于: 2018-03-22 17:00    发自: Web Page
做这个线程控制可以用 NSOperation
级别: 侠客
状态: 连续签到 - [1天]
UID: 532729
精华: 0
发帖: 80
可可豆: 264 CB
威望: 264 点
在线时间: 400(时)
注册时间: 2015-12-20
最后登录: 2018-06-25
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
发帖: 80
可可豆: 264 CB
威望: 264 点
在线时间: 400(时)
注册时间: 2015-12-20
最后登录: 2018-06-25
5 楼:  发表于: 2018-03-22 17:08    发自: Web Page
回 3楼(564282030) 的帖子
像我4楼这样用NSThread怎么弄嘞,NSOperation的常驻线程还没试过
级别: 圣骑士
状态: 连续签到 - [62天]
UID: 510329
精华: 0
发帖: 489
可可豆: 801 CB
威望: 673 点
在线时间: 839(时)
注册时间: 2015-09-30
最后登录: 2018-06-25
6 楼:  发表于: 2018-03-22 17:12    发自: Web Page
你这样self.thread不一定是你的常驻线程,也没有这样用NSTread的
级别: 精灵王

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

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

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

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

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

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