多线程陷阱

随着手机硬件的升级,多线程技术在应用开发中的地位可以说足以媲美UITableView了。然而,多线程技术在提供我们生产力的同时,也不可避免的带来了陷阱,正如著名计算机学者所言:能力越大,bug越大 本文尝试从多个角度聊聊这些陷阱。 内存占用 线程的创建需要占用一定的内核物理内存以及CPU处理时间,具体消耗参见下表。 类型 消耗估算 详情 内核结构体 1KB 存储线程数据结构和属性 栈空间 子线程(512KB)Mac主线程(8MB)iOS主线程(1MB) $堆栈大小必须为4KB的倍数子线程的最小内存为1...
Click to read more ...

链式实现数据源

链式调用chained calls指在函数调用返回了一个对象的时候使得这个调用链可以不断的调用下去,从概念上可以看做是一环扣一环的铁链,也能被称作方法链调用。 假设需求是在网络请求完成之后先筛选过期数据,然后转换成对应的数据模型进行展示。在Swift中可以直接这么写: let dataArr = result["data"] as! [Dictionary] self.models = dataArr.filter{ $0["status"] == "1" }.map{ Model($0) } 而OC的语法决定了这步操作不能像Swift一样简洁,最常见的代码就是这样: NSArray * dataArr = result[@"data"]; NSMutableArray ...
Click to read more ...

GCD封装

移动设备上的应用性能取决于两个重要因素:硬件性能和软件质量。 硬件 通常来说,CPU的核心频率决定了设备的处理速度,频率越高,运行越快。在手机还是单核时代时,硬件对于运行性能的提升更为感官。相同时间内执行任务的数量取决于CPU处理频率 软件 软件取决于编写的代码质量,良好的代码设计能在相同的时间内完成更多的任务。在手机进入多核时代之后,能够实现真正的并行处理,这时候多线程对于应用性能的提升要比提升CPU频率要明显的多 多线程不是提升应用性能的万能药,过多的线程会造成线程切换的巨大开销。以最常用的GCD为例,多数开发者对于串行队列和并行队列的认识可能只停留在如何使用上,没有去了解过线程存在哪些开销。下表展示了创建一个线程...
Click to read more ...

YYKit学习笔记

YYKit是集大成者的第三方表现,堪称国内最优秀的框架。因此,在YYKit中有太多的技术点值得挖掘思考,本文用来记录YYKit源码阅读中的心得以及认为有价值的技术点 QoS The following Quality of Service (QoS) classifications are used to indicate to the system the nature and importance of work. They are used by the system to manage a variety of resources. Higher QoS classes receive more resources than lower ones during re...
Click to read more ...

DNS防劫持

DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应。 DNS劫持的主要表现为看视频,点击之后莫名其妙的跳到了某些广告网站。正常情况下,当我们点击某个链接的时候,会向一个称作DNS服务器的东西发出请求,把链接转换成机器能够识别的ip地址,其过程如下: 域名->ip地址的过程被称作DNS解析。在这个过程中,由于DNS请求报文是明文状态,可能会在请求过程中被监测,然后攻击者伪装DNS服务器向主机发送带有假ip地址的响应报文,从而使得主机访问到假的服务器。 NSURLProtocol NSURLProtocol是苹果提供给开发者的黑魔法之一,大部分的网络请求都能被它拦截并且篡改,以...
Click to read more ...

质量监控-卡顿检测

不管是应用秒变幻灯片,还是启动过久被杀,基本都是开发者必经的体验。就像没人希望堵车一样,卡顿永远是不受用户欢迎的,所以如何发现卡顿是开发者需要直面的难题。虽然导致卡顿的原因有很多,但卡顿的表现总是大同小异。如果把卡顿当做病症看待,两者分别对应所谓的本与标。要检测卡顿,无论是标或本都可以下手,但都需要深入的学习 instruments与性能 在开发阶段,使用内置的性能工具instruments来检测性能问题是最佳的选择。与应用运行性能关联最紧密的两个硬件CPU和GPU,前者用于执行程序指令,针对代码的处理逻辑;后者用于大量计算,针对图像信息的渲染。正常情况下,CPU会周期性的提交要渲染的图像信息给GPU处理,保证视图的更新。一旦其中之一响应不过来,就会表现为卡顿。因此多数情况下用到的工...
Click to read more ...

一次方法适配实践

前言 问题 方案1:不修改原接口的基础上添加递归调用 方案2:提供额外的接口来完成操作 方案3:method_swizzling 尾言 前言 回顾笔者的runtime系列文章,发现实践略少,恰好近来一位朋友入职新公司后进行codereview时遇到了一个问题,和他讨论后制定了一个使用runtime的方案来解决问题,正好记录下这个方案。 问题 在朋友的项目中存在一个异步获取沙盒文件的接口,伪实现如下: define BLOCK_SAFE_CALLS(_b_, _f_, _e_) if (_b_) { _b_(_f_, _e_); } - (void)asyncFetchAllFoldersWithCompleteBlock: (void(^)(NSA...
Click to read more ...