排序算法,伪代码实现

一、插入排序

1. 直接插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 使用插入排序算法,将目标数组从小到大排列
* @param array 待排序的目标数组
* @param n 数组长度
*/
void InsertSort(int array[], int n) {
int i, j;
int tmp;
for (i = 1; i < n; i++) {
// 遍历待排序元素
tmp = array[i];
for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
// 遍历已排序元素
array[j + 1] = array[j];
}
array[j + 1] = tmp;
}
}

时间复杂度 O(n^2),空间复杂度 O(1)。直接插入排序是稳定的排序算法。

Read More

如何在验证失败的情况下发布 Pod

前言

在 CocoaPods 发布 Pod 的最后一步是执行 pod trunk push 命令,pod-trunk 首先会对你创建的 Pod 进行验证,验证通过才允许上传。

有时,希望在 Pod 验证失败的情况下也能够上传,关于这种做法是否合理 这里 有相关讨论。讨论中 @mxcl 给出了一种绕过发布前验证的方法,如下文所述。

正文

pod 命令使用 Ruby 写成,使用解释型语言的好处是我们可以方便的修改命令的逻辑。只要找到目标代码,注释掉验证 Pod 的逻辑便能达到目的。

首先执行 gem env,如下变量给出了 Ruby 库安装的位置。

1
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/2.4.0

当前,pod trunk push 命令文件对于 Ruby 库根目录的相对位置是 gems/cocoapods-trunk-1.3.0/lib/pod/command/trunk/push.rb,只要注释掉如下一行代码即可。

1
2
3
4
5
6
7
8
def run
update_master_repo
# validate_podspec # 删除验证逻辑
status, json = push_to_trunk
update_master_repo

# ...
end

callMethodWithCompletionBlock 中 Block 的内存管理

开发中不时会遇到 [obj callMethodWithCompletionBlock:^{ [obj doSomething] }] 这种写法。调用一个 OC 实例对象的带有 block 回调的方法,并且 block 实现又引用了该实例变量。写到这里经常会犹豫,要不要弱引用该实例变量,会不会造成循环引用。本文通过 Demo 演示了相关的几种情况,并对内存管理加以分析。

Read More

像素如何被绘制到屏幕上(译)

前言

之前看到一篇很好的关于视图渲染的文章(Getting Pixels onto the Screen),最近项目中遇到一些帧率优化的问题,想起来又阅读了一遍,并且抽时间进行了翻译,以便今后学习查阅。

正文

将内容显示到屏幕上,有许多方式可以实现。这个过程包含许多框架,依靠许多函数和方法的组合实现。本文讨论该过程的底层原理。当你需要考虑相关性能问题时,本文内容能够帮助挑选最优的 API。本文研究的对象是 iOS 系统,不过其中大部分内容也适用于 OS X。

Read More

Git 回滚多次提交最佳实践

一、前言

在开发过程中有这么一种情况,某个特性开发的代码需要回滚,但是该特性的开发提交和所有即将上线的提交处于统一分支,此时需要将该特性相关的提交依次回滚。在回滚代码时希望满足两个要求,能够保留详细的回滚日志信息、只产生一次提交记录。

Read More