前言
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_mutex和pthread_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、