Xcode工程与Cocoapods

Xcode工程 一个常见的Xcode的工程如下: 可以看到我们经常面对的一些地方,Workspace,Project,Scheme,Target Target Target是最小的编译单元,产物可在Product目录下看到,target可以为多种类型,比如framwork,extension,application等,每一个target对应着一个product产物,且可以独立配置。 Target配置 对于每一个Target,都有自己的独立配置,如上图中绿框所示,分别是 * General:配置基础的信息,如Product的名字,bundle ID等信息。 * Signing & Capailities:签名,能力(如推送能力)配置 * Resource Tags:按需加载资源配置 * Info:info文件配置,如权限配置等 * Build Settings:配置Target,如指定使用的编译器,目标平台、编译参数、头文件搜索路径等 * Build Phases:build阶段配置,如前置依赖、…

iOS中的库

什么是库 库(Library)可以粗暴分为源码库和二进制库。源码简单来说就是一堆可以复用的代码文件的集合,二进制库就是对源码库编译之后的二进制库文件。本文主要讨论的是iOS中二进制库。 动态库、静态库、framework iOS端在使用的时候有两种link方式,静态链接和动态链接,于是便有了静态库和动态库。 我们可以根据文件类型直观的分辨动态库和静态库。 一般来说,动态库以.dylib或者.framework为文件后缀;静态库为.a或者framework. 严格来说framework并不是库的类型,它是一种打包动态库或者静态库后的包,通常里面还可以包含资源文件、配置文件等东西 静态库 静态库即静态链接库(Windows 下的 .lib,Linux 和 Mac 下的 .a)。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。 静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。 动…

.Type、.self与元类型

元类型 元类型就是类型的类型。 比如我们说 5 是 Int 类型,此时 5 是 Int 类型的一个值。但是如果我问 Int 类型占用多少内存空间,这个时候与具体某个值无关,而和类型的信息相关。如果要写一个函数,返回一个类型的实例内存空间大小。那么这个时候的参数是一个类型数据,这个类型数据可以是直接说明的比如是 Int 类型,也可以从一个值身上取,比如 5 这个值的类型。这里的类型数据,就是一个类型的类型,术语表述为元类型:metaType。 .Type和.self Swift 中的元类型用 .Type 表示。比如 Int.Type 就是 Int 的元类型。 类型与值有着不同的形式,就像 Int 与 5 的关系。元类型也是类似,…

iOS中的图片读取

几个重要的API 获取Bundle Bundle是一个容器概念,NSBundle 对象不仅仅指我们可见的 XXX.bundle 文件,framework 也是属于 bundle 范畴。 Bundle 读取图片的 API UIImage 系统提供了两类方法: * 从Bundle中读取图片 * 从指定文件路径读取图片 这两类方法的本质区别在于,前者会在内存中缓存图片的二进制文件,后者不会。 APP工程中资源文件的读取方法 SDK 开发中,我们最常用的场景是,读取图片将其存在 UIImage 对象中,在某个地方显示出来。 所以,这里我们介绍一下,将图片读取到 UIImage 对象中的一些基础知识。 本文演示了,我们如何以下四种场景下,图片的读取方式: 读取 project 下的图片,如图中的编号1 读取 project 下文件夹中的图片,如图中的编号2 读取 Assets.xcassets 中的图片,…

iOS代码规范

前言 核心原则:代码应该简洁易懂,逻辑清晰 规范级别 * 【必须】:必须遵守。是不得不遵守的约定,一旦违反极有可能引起严重后果。 * 【建议】:建议遵守。长期遵守这样的约定,有助于维护系统的稳定和提高合作效率。 参考资料: * https://www.jianshu.com/p/c818c00e0690 * https://juejin.im/post/5940c8befe88c2006a468ea6 * http://www.hudongdong.com/talk/448.html 命名规范 类命名 * 【必须】类名(不包括类别和协议名)应该用大写开头的大驼峰命名法。类名中应该包含一个或多个名词来说明这个类(或者类的对象)是做什么的。 * 【必须】前缀:项目公共模块用项目前缀,其他各个模块用各自模块前缀(OC必须,swift?) 类别命名 * 【必须】类名+…

iOS模块化之cocoapods管理私有库

为什么要组件化 * 随着项目的不断迭代,各个模块会越来越复杂,各个模块相互依赖,而且每个模块可能会有共同的业务逻辑,导致整个项目维护起来比较麻烦。 * 可以采用组件化,把每个业务逻辑和模块分离,单独管理,这样比较方便维护,各个开发人员只需要关心好自己的模块就好了。 组件化好处 * 分工更加明确,提高开发效率 * 复用性更好,能迅速的组成更多的App 组件化思想 * 就好比封装控件,复杂的控件一般都会封装,组件化只不过是把每个模块单独抽出来,作为一个小工程,然后在组成一个一个完整的项目。 cocoapods中的spec文件 * podspec:描述自己组件工程的代码目录和资源目录在哪,还有自己组件工程所依赖其他框架,到时候就会根据podspec的指引去引入自己的仓库代码github中所有能能cocoapods管理的开源库中都有一个podspec文件,也就是pod描述文件 * 为框架添加sepc文件命令:pod spec create spec文件名 // 创建pod索引库,固定写法,并且定义索引库的名字为s,后续通过s,就能拿到索引库…

I/O

同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO 一 几个概念 在进行解释之前,首先要说明几个概念: * 用户空间和内核空间 * 进程切换 * 进程的阻塞 * 文件描述符 * 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间 进程切换 为了控制进程的…