质量监控-卡顿检测

不管是应用秒变幻灯片,还是启动过久被杀,基本都是开发者必经的体验。就像没人希望堵车一样,卡顿永远是不受用户欢迎的,所以如何发现卡顿是开发者需要直面的难题。虽然导致卡顿的原因有很多,但卡顿的表现总是大同小异。如果把卡顿当做病症看待,两者分别对应所谓的本与标。要检测卡顿,无论是标或本都可以下手,但都需要深入的学习 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 ...

分类属性

前言 准备工作 类的属性 分类属性 从源码解析 总结 前言 前几天有人问我一个问题:为什么分类不能自动创建get set方法。老实说,笔者从来没有去思考过这个问题。于是这次通过代码实践跟runtime源码来探究这个问题。 准备工作 为了能减少输出类数据的代码工作,笔者基于NSObject的分类封装了一套代码 其中输出类实例变量的具体代码: - (void)logIvarsWithExpReg: (NSString *)expReg customed: (BOOL)customed { [NSObject kRecordOBJ]; unsigned int ivarCount; Ivar * ivars = class_copyIva...
Click to read more ...

闲聊内存管理

前言 ARC的内存管理 retain release weak dealloc __unsafe_unretained 尾话 前言 ARC作为一个老生常谈的话题,基本被网上的各种博客说尽了。但是前段时间朋友通过某些手段对YYModel进行了优化,提高了大概1/3左右的效率,在观赏过他改进的源码之后我又重新看了一遍ARC相关的实现源码,主要体现ARC机制的几个方法分别是retain、release以及dealloc,主要与strong和weak两者相关 ARC的内存管理 来看看一段ARC环境下的代码 - (void)viewDidLoad { NSArray * titles = @[@"title1", @"title2"]; } ...
Click to read more ...

定时器动画

关于定时器 声波动画 弹性动画 其他 任何动画离不开一个重要的概念——时间,CoreAnimation动画创建后在动画后续的不同时间点渲染了不同的图像帧,使值改变前后生成一个过渡的流畅动画 定时器的作用类似于CoreAnimation的操作,在定时器启动后对应的时间点插入回调任务。如果每个回调任务之间的间隔足够短,并在每个任务之间绘制图案,就能达成自制动画的效果。本文分别使用NSTimer和CADisplayLink两个定时器来实现不同的动画 关于定时器 iOS开发中有三种常见的定时器:NSTimer、CADisplayLink以及GCD Timer,前两个定时器在使用时要加入到某个运行的RunLoop当中,在每个回调时间点会唤醒线程,执行任务。GCD Ti...
Click to read more ...

位运算

前言 基础计算 位运算符 色彩存储 位运算应用 位运算与算法 位运算与密码 前言 现代计算机电路通过高电平/低电平两种状态,即为1/0状态,将数据按照特定的编码格式存储起来。 直接操作这些二进制数据的位数据就是位运算,在iOS中基本所有的位运算都通过枚举声明传值的方式将位运算的实现细节隐藏了起来: typedef NS_OPTIONS(NSUInteger, UIRectEdge) { UIRectEdgeNone = 0, UIRectEdgeTop = 1 << 0, UIRectEdgeLeft = 1 << 1, UIRectEdgeBottom = 1 <&l...
Click to read more ...

均衡代码职责

码农小明的项目 尾语 文章的标题有点绕口,不过想了半天,想不到更好的标题了。本文的诞生有一部分功劳要归于iOS应用现状分析,标题也是来源于原文中的“能把代码职责均衡的划分到不同的功能类里”。如果你看过我的文章,就会发现我是一个MVC主导开发的人。这是因为开发的项目总是算不上大项目,在合理的代码职责分工后项目能保持良好的状态,就没有使用到其他架构开发过项目(如果你的状态跟笔者差不多,就算不适用其他架构模式,你也应该自己学习) OK,简短来说,在很早之前我就有写这么一篇文章的想法,大致是在当初面试很多iOS开发者的时候这样的对话萌生的念头,下面的对话是经过笔者总结的,切勿对号入座: Q: 你在项目中使用了MVVM的架构结构,能说说为什么采用的是这种结构吗? ...
Click to read more ...