一句话笔记,某段时间内遇到或看到的某个可记录的点。
- 自旋锁 和 互斥锁
- 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
堆栈符号化还原有三种常见的方法:
- symbolicatecrash
- mac 下的 atos 工具
- 通过 dSYM 文件提取地址和符号的对应关系,进行符号还原
怎么收集 Carsh 日志,如果不使用第三方:
- 代码捕获crash,监听NSSetUncaughtExceptionHandler 和 signal 事件,可借助第三方工具KSCrash、plcrashreporte。
- Xcode获取发布版本崩溃信息
四、 NSArray MutableCopy 子项会改变吗
不会, 子项地址依然不变,除非对子项再一一处理,或者进行归档处理。
网友评论