美文网首页
一句话笔记(44)(锁)

一句话笔记(44)(锁)

作者: 天空中的球 | 来源:发表于2020-04-29 22:21 被阅读0次

一句话笔记,某段时间内遇到或看到的某个可记录的点。

  • 自旋锁 和 互斥锁
  • setValue forkey 和 setObject forkey 区别
  • 堆栈信息无模块地址如何分析 Carsh
  • NSArray MutableCopy 子项会改变吗
一、自旋锁 和 互斥锁
  • @synchronized 关键字加锁
  • NSLock 对象锁
  • NSConditionLock 条件锁
  • NSRecursiveLock 递归锁
  • pthread_mutex 互斥锁(C语言)
  • dispatch_semaphore 信号量实现加锁(GCD)
  • OSSpinLock 自旋锁

pthread_mutex 表示互斥锁。互斥锁可以传入不同参数,实现递归锁pthread_mutex(recursive)。NSLock,NSCondition,NSRecursiveLock,NSConditionLock都是内部封装的pthread_mutex,即都属于互斥锁。@synchronized是NSLock的一种封装,牺牲了效率,简洁了语法。

  • 自旋锁会忙等: 所谓忙等,即在访问被锁资源时,调用者线程不会休眠,而是不停循环在那里,直到被锁资源释放锁。
  • 互斥锁会休眠: 所谓休眠,即在访问被锁资源时,调用者线程会休眠,此时cpu可以调度其他线程工作。直到被锁资源释放锁。此时会唤醒休眠线程。
  • 短的时间内获得锁,自旋锁的效率远高于互斥锁,否则会使CPU效率降低。

OSSpinLock 表示自旋锁,从上图可以看到自旋锁的效率最高,但是现在的iOS因为优先级反转的问题,已经不安全,所以推荐使用pthread_mutex或者dispatch_semaphore

  • 死锁了解下:
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        dispatch_sync(dispatch_get_main_queue(), ^(void){
            NSLog(@"这里死锁了");
        });
    }
    return 0;
}
二、setValue forkey 和 setObject forkey区别
setValue forKey :
  • 方法是KVC(键-值编码),方法是在NSObject对象中创建的,也就是说所有的oc对象都有这个方法,所以可以 用于任何类
  • value可以是nil,如果为nil,则自动调用removeObject forkey方法
  • key必须为string类型的
  • 取值的时候valueforkey的key如果包含@符号,则取值时会自动把@去掉,程序crash
setObject forKey:
  • 方法是NSMutabledictionary特有的;
  • value不可以为nil,如果为nil,则程序崩溃在此;但value可以为[NSNull null],[NSNull null]为一个空对象,并不是nil;
  • Key的对象是一个id类型,并不是NSString,只不过我们经常使用NSString而已。
  • 取值的时候objectforkey的key如果包含@符号,无影响,可以正常取出该值

笔记来源:setValue forkey 和 setObject forkey区别

三、堆栈信息无模块地址如何分析 Carsh

堆栈符号化还原有三种常见的方法:

  1. symbolicatecrash
  2. mac 下的 atos 工具
  3. 通过 dSYM 文件提取地址和符号的对应关系,进行符号还原

怎么收集 Carsh 日志,如果不使用第三方:

  • 代码捕获crash,监听NSSetUncaughtExceptionHandler 和 signal 事件,可借助第三方工具KSCrash、plcrashreporte。
  • Xcode获取发布版本崩溃信息
四、 NSArray MutableCopy 子项会改变吗

不会, 子项地址依然不变,除非对子项再一一处理,或者进行归档处理。

相关文章

网友评论

      本文标题:一句话笔记(44)(锁)

      本文链接:https://www.haomeiwen.com/subject/iqktmhtx.html