iOS 常驻线程

开启线程需要占用一定的内存空间(默认的情况下,主线程占1M,子线程占用512KB)且每次开辟子线程都会消耗CPU。如果频繁使用子线程的情况下,频繁开辟释放子线程会消耗大量的CPU和内存,而且创建的线程中的任务执行完成之后也就释放了,不能再次利用,所以造成资源和性能的浪费。这种情况下可以通过创建一个常驻线程来解决。

常驻线程通过NSThread与runloop来实现。新建的子线程默认没有开启runloop,因此需要给这个线程添加了一个runloop,并且加了一个NSMachPort端口监听,防止新建的线程由于没有活动直接退出。

常驻线程

#pragma mark- 异步常驻线程
+ (void)logThreadEntryPoint:(id)__unused object {
    @autoreleasepool {
        [[NSThread currentThread] setName:@"com.log.LOGServiceThread"];
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}

+ (NSThread *)logThread {
    static NSThread *_logThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _logThread = [[NSThread alloc] initWithTarget:self selector:@selector(logThreadEntryPoint:) object:nil];
        [_logThread start];
    });
    
    return _logThread;
}

使用

[self performSelector:@selector(token) onThread:[[self class] logThread] withObject:nil waitUntilDone:NO];

退出

[NSRunLoop currentRunLoop]removePort:<#(nonnull NSPort *)#> forMode:<#(nonnull NSRunLoopMode)#>

只有从runloop中移除我们之前添加的端口,这样runloop没有任何事件,所以直接退出。


  • 参考资料

基于runloop的线程保活、销毁与通信

你可能感兴趣的:(iOS 常驻线程)