ios面试记录

iOS知识点(二)

2018-03-30  本文已影响13人  MyLee
一.runloop跟线程的关系
  1. runloop是为线程而生,每一个线程会对应一个runloop;
  2. 主线程runloop默认是开启的,子线程runloop需要手动开启;
    3.可通过以下方式开启一条常驻线程:
NSRunLoop * runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];
二. 线程之间的通信

1.GCD,一般用于UI更新

dispatch_async(dispatch_get_main_queue(), ^{
    //主线程操作UI更新
});
  1. performSelector
    a) performSelectorOnMainThread: withObject: waitUntilDone://切回主线程操作
    b) performSelectorInBackground: withObject: //切换到后台线程
    c) performSelector: onThread: withObject: waitUntilDone://切换到自定义子线程
  2. NSOperation
    [NSOperationQueue mainQueue] addOperationWithBlock: ^{}
三. 线程锁有几种

1 NSLock
2 synchronized代码块
3 GCD的 dispatch_semaphore_t(条件信号量)和dispatch_barrier_async/dispatch_barrier_sync;
4 NSCondition 使用其做多线程之间的通信调用不是线程安全的
5 NSConditionLock 单纯加锁性能非常低,比NSLock低很多,但是可以用来做多线程处理不同任务的通信调用
6 POSIX(pthread_mutex) 底层的api,复杂的多线程处理建议使用,并且可以封装自己的多线程
7 NSRecursiveLock 递归锁的性能出奇的高,但是只能作为递归使用,所以限制了使用场景

上一篇 下一篇

猜你喜欢

热点阅读