iOS 常见面试题

263 阅读2分钟

前言

1、OC内存管理,引用计数,strong,weak,weak指针存储,copy,assign,atomac todo

2、runtime todo

3、runloop todo

4、多线程 多读单写,同步栅栏函数+并发线程队列,锁相关 8种锁级用法

1)使用并发队列+同步读+异步栅栏函数写入,实现多读单写线程安全,已经实现。注:异步+并发队列读取会卡线程

2)八种锁

OSSPlinklock 自旋锁 
特点:忙等状态,效率最高,因为线程优先级问题,容易死锁,目前读写速度较快的操作,可以谨慎使用。

dispatch_semaphore 信号量

dispatch_semaphore本质也是一种锁,是对线程使用的资源进行加锁

dispatch_semaphore_create(0): 传入值必须 >=0, 若传入为 0 则阻塞线程并等待timeout,时间到后会执行其后的语句
**dispatch_semaphore_wait(signal, overTime):**可以理解为 lock,会使得 signal-1,初始值是0时,会卡住线程等待,需要收到signal+1之后才能继续向下执行,或者等待超时之后再执行

**dispatch_semaphore_signal(signal):**可以理解为 unlock,会使得 signal+1

dispatch_semaphore_create(n): 传入值必须 >=0, 若传入为 0 则阻塞线程并等待timeout,时间到后会执行其后的语句

n是控制并发队列的个数,达到N之后暂停代码之后,待收到dispatch_semaphore_signal(signal)之后,代码继续执行

pthread_mutex

特点:互斥锁,效率高

示例代码

#import <pthread.h>

static pthread_mutex_t pLock;
pthread_mutex_init(&pLock, NULL);
 //1.线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"线程1 准备上锁");
    pthread_mutex_lock(&pLock);
    sleep(3);
    NSLog(@"线程1");
    pthread_mutex_unlock(&pLock);
});

//1.线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"线程2 准备上锁");
    pthread_mutex_lock(&pLock);
    NSLog(@"线程2");
    pthread_mutex_unlock(&pLock);
});

NSLock   NSRecursiveLock

NSLock是对pthread_mutex普通锁的封装。pthread_mutex_init(mutex, NULL);默认属性为PTHREAD_MUTEX_NORMAL

NSLock 遵循 NSLocking 协议,使用方法与pthread_mutex类似,如下:

@protocol NSLocking
- (void)lock;
- (void)unlock;
@end

@interface NSLock : NSObject <NSLocking>
- (BOOL)tryLock;//tryLock 是尝试加锁,如果失败的话返回 NO
- (BOOL)lockBeforeDate:(NSDate *)limit;//是在指定Date之前尝试加锁,如果在指定时间之前都不能加锁,则返回NO
@end

NSRecursiveLock是对pthread_mutex递归属性下的封装,API与NSLock一致;

NSCondition

NSCondtion是对pthread_mutexpthread_cond的封装,具体类源码如下:

+ (void) initialize

{
  [NSLock class];   // Ensure mutex attributes are set up.
}

- (id) init
{
    if (nil != (self = [super init]))
    {
        if (0 != pthread_cond_init(&_condition, NULL))
        {
            DESTROY(self);
        }
        else if (0 != pthread_mutex_init(&_mutex, &attr_reporting))
        {
            pthread_cond_destroy(&_condition);
            DESTROY(self);
        }
    }
    return self;
}

- (void) signal
{
    pthread_cond_signal(&_condition);
}

- (void) wait
{
    pthread_cond_wait(&_condition, &_mutex);
}

- (void) broadcast
{
  pthread_cond_broadcast(&_conditon);
}

具体使用如下:

@interface NSCondition : NSObject <NSLocking> {
- (void)wait;//等待条件
- (BOOL)waitUntilDate:(NSDate *)limit;//超时等待
- (void)signal;//发送信号
- (void)broadcast;//广播信号
@end

5、block todo

6、网络相关 ,http,https,tcp,udp,socket  todo

7、设计模式 MVC,MVP,MVVM ,封装 todo

8、组件化,路由,协议,target-action,熟悉pod及git todo

9、算法 ,冒泡,快排,两数之和,字符串翻转,无重复子串,最长回文子串,二叉树层高,遍历,翻转,hashmap,常见的md5,sha-1,接雨水 ,LRU算法,todo

10、阅读第三方 sdwebimage,afn,yykit,源码 todo

11、本地存储  userdefault,本质是plist,SQLite,升级

12、Swift语法学习  todo

13、Flutter,了解

14、