崔岚清的个人博客

集跬步至千里,积小流成江海


  • 首页

  • 分类

  • 标签

  • 归档

记一次crash排查—dispatch_once引起的死锁

发表于 2019-02-27 | 分类于 iOS开发 |
该 bug 表现为:测试环境下,启动过程中 App 卡死,不响应任何操作;真机环境下,启动后直接crash。重现 bug 后暂停程序并打印堆栈信息,符号化后的堆栈信息涉及到公司内部代码 这里就不全贴出来了,栈顶的三条记录如下: 1234* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP fram ...
阅读全文 »

iOS-Runtime随笔——Message Forward与应用

发表于 2019-01-31 | 分类于 iOS开发 |
开发中我们可能遇到过这样的异常:unrecognized selector sent to xxxxxx,当我们调用的方法没有对应的实现(IMP)时,系统会抛出如上异常。但是在抛出异常之前,我们还有三次补救的机会: 动态方法解析:Dynamic Method Resolution 快速转发:Fast Forwarding 正常转发:Normal Forwarding 这个就是Objective ...
阅读全文 »

iOS-Runtime随笔——DenseMap浅析

发表于 2019-01-23 | 分类于 iOS开发 |
一、引言在上一篇文章中,我们探讨了weak的底层实现原理,其中涉及到一个概念——DenseMap,包括后面要讲到的NSObject的引用计数原理,都离不开DenseMap,因此,在开始后面的篇章之前,有必要了解DenseMap的底层实现和原理。 DenseMap实际上是一个基于二次探查法的哈希表,在runtime的应用非常广泛(用作object的引用计数表等)。其具体实现可以在objc4-750的 ...
阅读全文 »

iOS Runtime随笔——weak原理探究

发表于 2019-01-18 | 分类于 iOS开发 |
一、引言12345678910111213// 1.@property (nonatomic, weak) TestObject *weakObj;// 2.__weak TestObject *weakObj = obj;// 3.__weak __typeof__(self) weakSelf = self;TestBlock block = ^{ __strong __typ ...
阅读全文 »

一个objc_retain+16的crash问题分析

发表于 2018-12-18 | 分类于 iOS开发 |
由于测试用例不可能覆盖到所有情况,因此,上线后面对复杂的用户环境和用户操作,难免出现一些crash问题。crash也是很影响用户体验的,常见的crash异常信息有: EXEC_BAD_ACCESS (SIGSEGV/SIGBUS),发生在程序试图房屋无效的内存或试图以内存的保护级别所不允许的方式去访问内存的时候; EXEC_CRASH (SIGABRT),异常退出,比如:如果程序初始化时间过长而 ...
阅读全文 »

GCD源码分析(四)——dispatch_once(下)

发表于 2018-12-10 | 分类于 iOS开发 |
一、引言上篇文章中讲到,dispatch_once使用无锁方式实现线程安全和优异的性能。本篇文章我们来分析一下dispatch_once的性能。 从dispatch_once的源码可以看出,其本质就是一个if-else语句。我们使用非线程安全的纯if-else语句作为空白对照。 纯if-else: 12345678910- (void)benchmark { TestObject ...
阅读全文 »

GCD源码分析(三)——dispatch_once(上)

发表于 2018-12-06 | 分类于 iOS开发 |
一、前言12345678+ (instancetype) sharedInstance { static dispatch_once_t onceToken; static TestObject sharedInstance; dispatch_once(&onceToken, ^{ sharedInstance = [TestObjec ...
阅读全文 »

GCD源码分析(二)——Dispatch Queue和Thread Pool

发表于 2018-11-29 | 分类于 iOS开发 |
一、前言大部分的GCD操作都离不开队列(queue):使用dispatch_get_main_queue获取主队列,使用dispatch_queue_create创建一个自定义的队列,使用dispatch_get_global_queue获取一个全局的并发队列等等。那么GCD是如何通过这些队列实现多线程的呢?它又是如何管理这些队列的呢?dispatch_async/dispatch_sync是如何 ...
阅读全文 »

GCD源码分析(一)——“对象”和数据结构

发表于 2018-11-29 | 分类于 iOS开发 |
一、前言Grand Central Dispatch(GCD)作为iOS和MacOS开发中不可或缺的工具,它的重要性不言而喻。作为一个喜欢刨根问底的猿,知其然更要知其所以然。网上关于GCD解析的文章不多,仅有的几篇使用的源码版本很老,libdispatch从187.10发展到913.60,其内部已经发生了很多变化。趁工作之余断断续续把GCD的源码libdispatch-913.60.2.tar.g ...
阅读全文 »

OC中Block内存结构以及copy/持有外部变量等操作的实现原理分析

发表于 2018-11-16 | 分类于 iOS开发 |
一、前言最近对App中的埋点代码进行了改造(随着项目的增大,散落在系统各处的埋点代码实在不好管理),利用AOP的方式将散布在各个页面中的埋点代码统一起来组成一个独立的模块,从而减少埋点行为对业务代码的侵入。 熟悉iOS AOP编程的同学肯定听过Aspects这个框架,我们也使用这个框架实现Method Swizzle,通过Method Swizzle给指定的方法添加side-effect,在sid ...
阅读全文 »
12

Cui Lanqing

一枚有梦想的程序猿

15 日志
2 分类
13 标签
© 2019 Cui Lanqing
本站访客数:
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4