代理 Xcode SPM
由于网络问题,我们在使用 Xcode SPM 管理项目依赖库的时候,clone
依赖库那速度真的是拉的一泻千里💩。所以我们需要将 SPM 下载依赖库的过程交给我们的代理去处理。首先你需要一个科学上网工具,无论是客户端还是路由器刷机,此文章的例子都是基于本人网络环境 Surge
,其他的代理方式需自行研究。
由于网络问题,我们在使用 Xcode SPM 管理项目依赖库的时候,clone
依赖库那速度真的是拉的一泻千里💩。所以我们需要将 SPM 下载依赖库的过程交给我们的代理去处理。首先你需要一个科学上网工具,无论是客户端还是路由器刷机,此文章的例子都是基于本人网络环境 Surge
,其他的代理方式需自行研究。
指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char
类型变量的值是字符,int
类型变量的值是整数,指针变量的值是地址。在 C 语言中,指针有许多用法。本章将介绍如何把指针作为函数参数使用,以及为何要这样用。
假设一个指针变量名是ptr
,可以编写如下语句:
1 | ptr = &pooh; // 把 pooh 的地址赋给 ptr |
对于这条语句,我们说ptr
“指向”pooh
。ptr
和&pooh
的区别是ptr
是变量,而&pooh
是常量。或者,ptr
是可修改的左值,而&pooh
是右值。还可以把ptr
指向别处:
1 | ptr = &bah; // 把 ptr 指向 bah,而不是 pooh |
现在ptr
的值是bah
的地址。
要创建指针变量,先要声明指针变量的类型。假设想把ptr
声明为储存int
类型变量地址的指针,就要使用下面介绍的新运算符。
C 有一系列专门处理字符的函数,ctype.h
头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非零值(真);否则,返回口(假)。例如,如果 isalpha()
函数的参数是一个字母,则返回一个非零值。
1 | // cypher2.c -- 替换输入的字母,非字母字符保持不变 |
在 C 语言中,一直用 int
类型的变量表示 真/假
值。C99 专门针对这种类型的变量新增了 _Bool
类型。该类型是以英国数学家 George Boole 的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以日 _Bool
是 C 语言中布尔变量的类型名。_Bool
类型的变量只能储存 1(真)
或 0(假)
。如果把其他非零数值赋给 _Bool
类型的变量,该变量会被设置为 1
。这反映了 C 把所有的非零值都视为真。
1 | #include <stdio.h> |
C 编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。
典型的 C 实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转专换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。
目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。例如,可以在 MS Windows
或 Linux
系统下运行 1BM PC 兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是 Windows
和 Linux
所需的启动代码不同,因为这些系统处理程序的方式不同。
如下,输入一个数组和一个目标变量:
input: [1, 3, 1, 3, 2, 2, 5, -1]
input: 4
要求找到此数组中所有两数之和等于目标变量的元素集合并返回,并且结果中不能有重复项。
我们都知道有的程序员能创造 10 倍的价值,那么我们是吗?
根据 20 世纪 60 年代进行的一份研究,对开发人员的各种方面(如代码简单性、程序大小、调试技巧、程序执行等)进行了比较。根据这项研究,普遍的共识是,一个优秀的开发人员和一个差劲的开发人员之间的差异可以达到20 倍之多,而中间值在大多数情况下是 10 倍。
这就是说,假设你已经苦干了多年,吸收了所有可能的技术,最终达到了令人垂涎的 10 倍高级开发人员级别。太棒了,恭喜!你应该得到名望和随之而来的尊重。现在你想攀登下一座山:成为一名优秀的技术经理。想想就觉得很美。
等等,让我们花点时间想想。
在许多方面,苹果的故事都是一些有趣的历史偶然事件将技术融合在一起,创造出比以前更好的东西:OS X 是 MacOS 与 NeXTSTEP 的结合。OC 是 Smalltalk 类面向对象编程与 C 的结合。iCloud 则是苹果移动服务与云平台的结合。
虽然苹果技术栈的许多方面都是如此,但是不得不说苹果技术中的进程通讯走的是“反人类”的道路。
由于不是根据每个节点上最优原则进行设计,苹果的进程间通信解决方案更显得混乱扎堆。结果是,大量重叠,不兼容的 IPC 技术在各个抽象层随处可见。(除了 GCD 还有剪贴板)
从低级内核抽象到高级,面向对象的 API,它们都有各自特殊的表现以及安全特性。但是基础层面来看,它们都是从不同上下文段传递或者获取数据的机制。