iOS离屏渲染之优化分析

在进行iOS的应用开发过程中,有时候会出现卡顿的问题,虽然iOS设备的性能越来越高,但是卡顿的问题还是有可能会出现,而离屏渲染是造成卡顿的原因之一。因此,本文主要分析一下离屏渲染产生的原因及避免的方法,最后介绍一下Xcode自带的分析离屏渲染的工具Instruments的使用。

UIView和CALayer关系

UIView继承自UIResponder,可以处理系统传递过来的事件,如:UIApplicationUIViewControllerUIView,以及所有从…

Masonry1.0.2 源码解析

在了解Masonry框架之前,有必要先了解一下自动布局的概念。在iOS6之前,UI布局的方式是通过frame属性和Autoresizing来完成的,而在iOS6之后,苹果公司推出了AutoLayout的布局方式,它是一种基于约束性的、描述性的布局系统,尤其是苹果的手机屏幕尺寸变多之后,AutoLayout的应用也越来越广泛。

但是,手写…

iOS绘图框架CoreGraphics分析

由于CoreGraphics框架有太多的API,对于初次接触或者对该框架不是十分了解的人,在绘图时,对API的选择会感到有些迷茫,甚至会觉得iOS的图形绘制有些繁琐。因此,本文主要介绍一下iOS的绘图方法和分析一下CoreGraphics框架的绘图原理。

一、绘图系统简介

iOS的绘图框架有多种,我们平常最常用的就是UIKit,其底层是依赖CoreGraphics实现的,而且绝大多数的图形界面也都是由…

iOS之UIWebView无法获取web标题

最近遇到了一个问题,就是在UIWebView的代理方法里,执行document.titlejs代码无法获取网页标题,代码如下:

iOS的阴影绘制及性能优化

今天来讲讲iOS开发过程中的阴影绘制及其潜在的绘图性能问题。虽然在开发过程中,我们使用阴影功能的机会不是很多,但是如果用了,有可能引起如卡顿等性能问题,所以,还是有必要来探究一下阴影的绘制过程,及如何提高阴影的绘制性能。

阴影绘制

阴影可以通过设置layer层的shadowXXX属性,就可以很方便的为UIView添加阴影效果,但是不同的设置方式可能产生性能方面的问题,下面介绍一下不同方式对性能的影响。

方式一

通过设置下面的4个属性,就可以添加阴影,这种方式可能产生性能问题,因为绘制阴影而不指定阴影路径,在绘制阴影过程中,就会产生大量的离屏渲染(Offscreen-Rendered),非常消耗性能,进而造成动画卡顿的问题。

离屏渲染

造成离屏渲染的原因很多,比如:遮罩、阴影、抗锯齿等等,而阴影造成离屏渲染的原因是:iOS会先绘制目标的阴影,然后绘制目标的本身,在没有指定阴影的绘制路径时,iOS

ccache – 让Xcode编译速度飞起来

今天来介绍一个小工具ccache,其可以提高xcode的编译速度。说起缘由,是因为我的苹果电脑配置比较低,而每次开发调试或测试打包都需要编译工程,虽然项目工程代码量不算大,但是编译的时间还是很长,尤其是修改了头文件或者Archive打包时,看着进度条像蜗牛在爬一样,心里都有小动物在奔腾……

好在遇到了ccache,其原理是通过把项目的源文件用ccache编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:CC++Objective-CObjective-C++,但是如果找不到…

iOS开发中如何创建多个target

在开发iOS应用程序的过程中,经常需要根据不同的需求,切换到不同的项目配置,或者打不同的包(测试环境、开发环境、生产环境等等),如果每次都是手动配置,一则比较麻烦,二则容易配置错,那么有没有更好的方案来解决这个问题呢?答案是:有的。我们可以根据不同的需求,创建不同的target,在不同需求要切换配置或打包时,直接选择对应的target完成工作,从而提高我们的开发效率。

创建多个target有两种方式,一种是创建多个info.plist的配置文件,另一种是拷贝整个工程所需的文件,如:源文件、资源文件、配置文件等等。下面介绍这两种方式的创建过程:

方式一

复制target

首先复制target,然后在弹出的框中,选择Duplicate Only,即可复制一个…

iOS的消息转发机制详解

iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法;或者,还有另外的方法,由于Objective-C是一门动态语言,我们也可以在运行期再给类添加该方法,一样可以解决该问题,而这就涉及了类的消息转发机制。

本文就主要来介绍一下iOS系统的消息转发机制,探究一下在调用一个方法时,如果本类中没有该方法时,对象究竟是如何进行消息转发的,来避免程序抛出异常。

异常现象

当调用的对象方法不存在,即使经过消息转发也不存在时,就会抛出下面的异常

SDWebImage4.0.0 源码解析

在开发iOS的客户端应用时,经常需要从服务器下载图片,虽然系统提供了下载工具:NSData、NSURLSession等等方法,但是考虑到图片下载过程中,需要考虑的因素比较多,比如:异步下载、图片缓存、错误处理、编码解码等,以及实际需要中根据不同网络加载不同画质的图片等等需求,因此下载操作不是一个简单的下载动作就可以解决。

针对上述问题,目前常用的开源库就是SDWebImage,它很好的解决了图片的异步下载、图片缓存、错误处理等问题,得到了广泛的应用,使得设置UIImageViewUIButton对象的图片十分方便。本文就从源码的角度,剖析一下这款优秀的开源库的具体实现。

类结构图

SDWebImage的源码的类结构图和下载流程图在官方的说明文档里有介绍,通过UML类结构图详细的介绍了该框架的内部结构,以及通过流程图介绍了具体的下载过程。

下图是我总结的SDWebImage的结构图,简单的把…