夏树正茂

花有重开日,人无再少年.

Objective-C库文件使用小记

| Comments

静态库 VS 动态库
  • 静态库:静态库在Objective-C里面以.a或者.framework作为后缀,目前开发者自己创建的库文件(Framework)其实都是以静态库的形式链接到执行文件的。链接时完整的拷贝到了可执行文件中,被多次使用就会有多份拷贝(eg:iOS8+的Extention中使用)。静态库文件一般都会比较大,因为所有要使用的数据都会被编译进去,而且如果库文件的某个函数改变了,那么就又需要重新编译新的库文件了,优点就是编译后的执行程序不需要外部的函数库支持,因为所有的函数都已经被编译进去了。
  • 动态库:动态库在Objective-C里面以dylib或者.framework最为后缀,系统为我们提供的framework就是动态库,目前开发者是不允许使用动态库的,因为我们自己创建的库文件虽然buildSetting中的Mach-O Type设置为Dynamic Library,但是使用时直接链接到程序里面的,而不是放在服务器上进行更新,开发者如果使用动态库放在服务器上,然后动态的加载dlopen是不会通过审核的,不然Apple的审核就没有意义了。动态库在链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序间共用,节省内存,而且升级方便。

Nullable和__kindof的使用

| Comments

nullable和__kindof的使用记录

2015年的WWDC里面介绍了几个新的关键字:__kindofnullable。如果能很好的使用它们,编译器在我们犯错误的时候就能给予我们提示,将bug扼杀在摇篮里。

动画黄金搭档:CADisplayLink&CAShapeLayer

| Comments

我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLinkCAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一些启发。

在接下来的文章中,我们会构建如下的一个动画:

image

该动画是在du的轮廓中进行,类似一个镂空效果,轮廓的填充是用双波浪的形式,类似于水流慢慢注入容器的过程。
动画使用CADisplayLink来进行刷新,保证了动画的流程性,利用CAShapeLayer来构建波浪的轮廓,最后利用CALayermask属性来实现逐渐填充的过程。

布局万花筒:UIColletionview

| Comments

UICollectionView是iOS6的时候引入的,它同UITableView共享一套API设计,都是基于datasource和delegate,都继承自UIScrollView。但它又与UITableView有很大不同,它进行了进一步的抽象,将它的所有子视图的位置、大小、transform委托给了一个单独的布局对象:UICollectionViewLayout。这是一个抽象类,我们可以继承它来实现任何想要的布局,系统也为我们提供了一个开箱即食的实现UICollectionViewFlowLayout。在我看来,没有任何排列布局是UICollectionViewLayout不能实现的,如果有那就自定义一个。

如何检测iPhone设备处于低电量模式

| Comments

在iOS9中,苹果为iPhone增加了低电量模式,开启低电量模式后,系统会为了节约电量而停止一些耗电的行为,例如接收邮件,通过Hey Siri唤起,后台消息推送等。

很重要的一点是系统不会为用户自动打开低电量模式,而是由用户自己去决定是否进入低电量模式,进入低电量模式后状态栏中的电池会变为黄色:

我所理解的Runtime

| Comments

Objective-C是一门基于对象的动态语言,它里面所有的继承自NSObject的类本身以及类所实例化的对象都是对象,好像有点儿绕,大意就是这是一门基于对象的语言,就连类自己也是一个对象,程序运行起来以后类本身也会被初始化,也占有内存空间。
在这篇笔记里,我会记录如下的一些信息:

  • 消息传递
  • runtime如何处理对象
  • self 和 super
  • Method Swizzling
  • 消息转发

定制自己的单元测试

| Comments

我们在进行开发的过程中,会对新开发的功能进行但愿测试,不管是TDD还是BDD,我们都需要利用单元测试来保证我们新功能的正确性,这其中包括执行结果是否正确,对边界处理是否周全,一些特殊情况的测试,这对于一些功能较少的工程可能写好一个testXXX函数,执行一遍单元测试,不会花太多时间,但是对于一些大的工程,可能测试的类会有成百甚至上千个,当你想专注于测试新开发的功能是,每次测试都全部跑一次完整的单元测试,这显然是很耗费时间的行为。

Swift脚本编辑

| Comments

Swift是一种编译型语言,功能强大而且灵活性十足,现在你甚至可以在shell脚本中运行Swift代码。

编写shell脚本包括以下几个步骤:

  1. 使用编辑器创建脚本。
  2. 设置脚本的权限,使其能够执行。
  3. 执行脚本。

面试精选:链表问题集锦

| Comments

前言:链表由于其本身的灵活性,很能考察程序员的编程功底,在面试中被问到链表相关的知识的概率很高,所以很值得我们去学习汇总,下面的内容非原创,而是自己在复习链表的过程中从别处摘抄而来,若想查看原文内容,可以看文章末尾的链接。

下面是本文所要用到的链表节点的定义:

struct Node{
    int data;
    Node* next;
};