-
App启动分析与优化策略
启动过程分析 解析Info.plist 加载相关信息,例如闪屏 沙箱建立、权限检查 Mach-O加载 Mach-O 文件:我们写的程序想要跑起来,肯定它的可执行文件格式要被操作系统所理解。比如ELF是Linux下的可执行文件格式,那么对于OS X / iOS来说,Mach-O 是其可执行文件格式。 Mach-O格式主要包括以下几种文件类型: Executable:应用的主要二进...…
-
反射的概念及应用
前言反射是指程序在运行时可以访问、检测、修改它本身状态或行为的一种能力。通常动态语言如ObjC具有这种特性。下面将介绍反射的特性以及在iOS中的应用举例。使用反射可以做什么 反射的应用场景 在运行时可以判断一个对象是否属于某个类、是否遵守某个协议、是否响应某个方法 在运行时可以构造任意一个类、生成一个对象、得到一个方法 在运行时动态调用一个方法ObjC中的反射由于ObjC的动态特性,下面方法可以在运行时根据字符串参数反射得到类、方法selector、协议方法等// SEL和字符串转...…
-
AppDelegate如何瘦身?
前言AppDelegate瘦身指的就是对AppDelegate类进行解耦和拆分。AppDelegate 作为整个应用程序的代理对象,处理应用程序的生命周期、根视图控制器初始化、应用级URL跳转、推送通知接收、网络配置、及其他第三方SDK初始化等工作。为了让AppDelegate内部代码简洁,逻辑清晰,则需要对其进行整理拆分。下面有几种瘦身方式:模块化管理通过一个模块化管理类,将AppDelegate中的职责拆分至各个模块中去处理,简化了AppDelegate内部代码。FRDModuleMa...…
-
VPS下搭建ownCloud云盘
前言鉴于各大网络云盘的各种限制,收费制度和用户体验并不好,利用VPS来搭建一个私有云盘就会变得越来越受欢迎,目前主流的开源软件ownCloud,NexCloud等都可以实现,下面我们就选ownCloud来搭建,vps选择的搬瓦工。准备 一台VPS服务器,开启root权限 LAMP环境。ownCloud需要Web服务器,数据库和PHP才能正常工作。 设置LAMP(Linux,Apache,MySQL和PHP)服务器满足所有这些要求 安装ownCloud ,并配置相关参数。设置LAMP环...…
-
Method Swizzling
前言Method swizzling 用于改变Foundation 框架中一个已存在的方法(selector)的实现。常用于对系统方法实现的替换,可实现插入自定义代码逻辑,代码hook等功能。实现原理这项技术使得在运行时通过改变 selector 在类的消息分发列表中的映射从而改变方法的掉用成为可能。例如:我们想要在一款 iOS app 中追踪每一个视图控制器被用户呈现了几次: 这可以通过在每个视图控制器的 viewDidAppear: 方法中添加追踪代码来实现,但这样会大量重复的样板代码...…
-
RunLoop的实现原理及应用
什么是RunLoop?为了保证线程能随时处理事件且不会退出,我们需要一个run loop 运行循环来一直保持能持续接收并处理各种事件,确保执行线程不被销毁。实现思路类似于如下代码:// Event loopfunction loop() { initialize(); do { var message = get_next_message(); process_message(message); } while (message != quit...…
-
深入剖析Autorelease Pool (自动释放池)
前言在MRC的内存管理模式下,可以将创建的对象加入自动释放池,程序员则无需手动调用release方法来释放对象,而是当自动释放池销毁的时候会对其中的每一个对象发送release消息,从而达到自动释放的目的。下面我们一步步揭开它的神秘面纱,深度剖析autoreleasepool的实现原理。@autoreleasepool 实现原理main.m文件中的@autoreleasepool()在iOS代码main.m文件中,我们可以看到@autoreleasepool{}代码块,其中包含的这一行代码...…
-
离屏渲染知多少?
预备知识OpenGL中,GPU屏幕渲染有两种方式: On-Screen Rendering (当前屏幕渲染):指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区进行。 Off-Screen Rendering (离屏渲染):指的是在GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作。当前屏幕渲染不需要额外创建新的缓存,也不需要开启新的上下文,相对于离屏渲染性能更好。但是受当前屏幕渲染的局限因素限制(只有自身上下文、屏幕缓存有限等),当前屏幕渲染有些情况下的渲染解决不了的,就使用到离屏...…
-
iOS中各种“锁”的理解及应用
前言通常在一般的iOS应用开发中会很少碰到使用“锁”的业务逻辑,但是在需要使用多线程技术,解决大多数场景写的业务逻辑时,会使用到线程锁来保证临界数据的读写安全性。当然,“锁”的概念在计算机科学及应用中也是举足轻重的,对于要写出高质量、高性能、安全可靠的代码来说,也是非常重要的。预备知识 线程调度 计算机通常只有一个CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU的使用权,分别...…
-
对象、类、元类、isa指针之间的爱恨情仇
前言在iOS开发中,对象、类的使用可以说是无处不在,伴随着整个项目的开发周期,也是程序的重要组成部分。但是在日常开发中,很难直观的见到元类、isa指针,那么它们究竟是谁,在开发中起着什么作用呢?下面我们就分别介绍下这几位亲兄弟的结构体定义,以及之间的关联关系。类(class)的结构体定义类对象(Class)是由程序员定义并在运行时有编译器创建的,他没有自己的实例变量,这里需要注意的是类的成员变量和实例方法列表是属于实例对象的,但其存储于类对象当中。下图指出类的结构体定义:// An opa...…