Git 是一款分布式版本控制系统,于 2005 年由 Linus Torvalds 创造并开源发布。Git 的设计初衷是为了更好地管理 Linux 内核代码,它的分布式特性使得多人协作开发和大型项目的版本控制变得更加高效和可靠。现在,Git 已经成为了开源社区和软件开发领域中最受欢迎的版本控制工具之一。
Git 的基本概念包括:版本控制版本控制是指对文件或代码的修改历史进行记录和管理,以便于多人协作开发和版本回溯。Git 通过记录每次提交的快照来实现版本控制,并提供了一系列的命令和工具来管理版本库。
分支分支是指从一个代码库中派生出来的独立代码线。在 Git 中,每个分支都是一个独立的代码库,可以在分支上进行修改和提交,而不影响主线代码的开发。分支在多人协作和复杂项目的版本控制中起到了重要作用。
提交提交是指将代码库中的修改保存到版本库中的操作。每次提交都会创建一个新的版本快照,并记录下该次提交的作者、时间、提交信息等相关信息。
远程仓库远程仓库是指存放在网络上的代码库,通常由多人协作开发的团队使用。Git 通过远程仓库来实现分布式版本控制,可以将代码库复制到本地进行修改和提交,然后将 ...
C 语言能让程序员恰到好处的控制程序,这是它的优势之一。程序员通过 C 的内存管理系统指定变量的作用域和生命周期,实现对程序的控制。合理使用内存存储数据是设计程序的一个要点。
存储类别C 提供了多种不同的模型或存储类别在内存中存储数据。要理解这些存储类别,我们先来了解一些概念和术语。
程序中的大部分数据都是存储在内存中。从硬件方面来看,被存储的每个值都占用一定的物理内存,C 语言把这样的一块内存称为 对象(objc)。这里所指的对象和我们面向对象编程所说的对象是不同的,要注意(面向对象中的对象指的是类对象)。这里所说的对象实际指的是一块可以存储数据的内存。对象可以存储一个或多个值。一个对象可能并未存储实际的值,但是它在存储适当的值时一定具有相应的大小 。
从软件方面来看,程序需要一种方法访问对象。这可以通过声明变量来完成:
1int entity = 3;
该声明创建了一个 entity 标识符。标识符是一个名称,可以用来指定特定对象的内容。变量名不是指定对象的唯一途径。考虑下面两个声明:
12int *pt = &entity;int ranks[10];
pt 是一 ...
在一款 App 从开发到上架都会经历 编译 -> 打包 -> 签名 -> 推送 App Store Connect -> 提审 -> 上架 的过程。其中编译打包这种重复且繁琐的工作公司内都会有一个 CI 平台去负责,我们今天就来了解一下 CI 的编译打包流程是怎样的。
fastlane 简介fastlane 是自动为 iOS 和 Android 应用程序进行测试版部署和发布的最简单方式。它会为你处理所有繁琐的任务,如生成屏幕截图、处理代码签名和发布应用程序。
下面是一个简单的编译发布的例子:
123456789101112lane :beta do increment_build_number build_app upload_to_testflightendlane :release do capture_screenshots build_app upload_to_app_store # 将屏幕截图和二进制文件上传到 iTunes slack # 让你的队友知道新版本上线了end
上 ...
编译准备首先保证硬盘空间足够,本人一套流程下来文件夹有将近 60GB 大小。接下来是相关环境的安装,因为我的环境都是最新的,所以基本安装的都是最新版的包,如果你的环境不是新版的话,请找对应版本包安装。本人环境说明:
名称
版本
芯片
Apple M2 Pro
macOS
Ventura 13.3
Python
3.11.2
CMake
3.26.3
ninja
1.11.1
sccache
0.4.1
Xcode
14.3
我们可以通过 homebrew 统一安装环境:
1$ brew install cmake ninja sccache
此文只介绍 Xcode 调试环境,如果想用 VS Code 调试的话,需要用 Ninja 编译,Ninja 的编译请移步官方文档。
项目拉取首先我们在文稿中新建一个文件夹,然后 cd 到我们的目录:
12$ mkdir ~/Documents/swift-project$ cd ~/Documents/swift-project
然后找到你的 Xcode 所支持的 Swift 版本,因为本人的 Xco ...
编译环境
macOS Ventura 13.3
Xcode 14.3
Apple M2 Pro
如果环境大体相同可用我已整理好的工程:objc4-866.9 源码编译
源码下载建议到 Apple Open Source 下载对应版本的包,此处指列出本机环境所需要的包
objc4-866.9
dyld-1042.1
Libc-1534.81.1
Libc-825.40.1
libclosure-84
libdispatch-1412
libplatform-288
libpthread-514
xnu-8792.81.2
工程修改我们在 objc4 工程目录下新建一个 include 文件夹,用来存放修复编译问题的头文件。
修改脚本修改 objc target 的 Run Script (markgc) 脚本,将 macosx.internal 改成 macosx:
修改Base SDK在 Project -> build setting -> Base SDK,选择 macOS:
修改编译目标
设置 Header Search Paths将我们刚才创建的 ...
macOS
未读ProvisionQL 是一款支持快速预览 ipa 和 provision 等文件信息的插件。它能以美观整洁的页面快速预览大量信息,包括设备 UUID、证书、授权等等。
截图示例如下:
此插件支持的文件类型有:
.ipa - iOS 的打包应用
.xcarchive - Xcode archive
.appex - iOS/OSX 应用扩展
.mobileprovision - iOS provisioning profile
.provisionprofile - OSX provisioning profile
插件安装在 macOS 上我们可以通过 Homebrew 的方式安装:
1$ brew install --cask provisionql
安装之后我们就可以在文件上通过按空格键快速查看文件信息。
插件冲突修复安装之后我们会发现,如果我们在 .mobileprovision 类型的文件上按空格并未启用 ProvisionQL 的快速预览功能,这是因为 Xcode 现在有了自己的 Mobile Provision Quick Look 插件。因为它是 ...
之前的文章介绍过,字符串是以空字符(\0)结尾的char类型数组。常用的输出字符串的方式有两种 printf()和puts(),他们不同之处在于,printf()是格式化输出字符串,而puts()只显示字符串。
在程序中定义字符串用双引号括起来的内容称为字符串字面量,也叫字符串常量。字符串常量属于静态存储类别,这说明如果在函数中使用字符串常量,该字符串只会被存储一次,在整个程序的生命期内存在,即使函数被调用多次。用双引号括起来的内容被视为指向该字符串存储位置的指针。这类似于把数组名作为指向该数组位置的指针。如果确实如此,下面的程序会输出什么?
123456#include <stdio.h>int main(void) { printf("%s, %p, %c\n", "we", "are", *"space farers"); return 0;}
输出如下:
1we, 0x100003fa7, s
字符串数组与指针1const char ar1[] = & ...
macOS 上的 Ruby 环境管理我相信是大多数软件开发都会遇到的一个问题,如果我们需要同时管理多个 Ruby 版本的话,有 rbenv 和 rvm 的方式,具体的操作网上已有大量的文章供我们学习,本文不再做赘述。今天我们来看一下如何使用 Homebrew 来管理我们的 Ruby。
什么情况下我们可以使用 Homebrew 来管理我们的 Ruby 环境?
你只是学习一下 Ruby 语言
你只是想编译一个项目(例如我们使用 cocoapods 来管理我们的项目)
在使用之前,首先我们需要知道用 Homebrew 来管理 Ruby 有什么缺点。
当你升级其他 Homebrew 包时,Homebrew 可能会将 Ruby 更新到新版本
你不能非常轻松的在多个 Ruby 版本之间频繁切换
如果你的需求不满足上述描述的话,特别是需要经常切换 Ruby 版本,那么 Homebrew 的方式就不是太适合。
macOS 系统的 RubymacOS 预装了“系统Ruby”。macOS Monterey 包含 Ruby 2.6.8,这不是最新版本。使用 macOS 系统 Ruby 不是一个好 ...
编程语言
未读由于网络问题,我们在使用 Xcode SPM 管理项目依赖库的时候,clone依赖库那速度真的是拉的一泻千里💩。所以我们需要将 SPM 下载依赖库的过程交给我们的代理去处理。首先你需要一个科学上网工具,无论是客户端还是路由器刷机,此文章的例子都是基于本人网络环境 Surge,其他的代理方式需自行研究。
设置终端代理Surge中按快捷键 ⌘ + c复制终端代理命令,并终端中执行命令(ClashX客户端类似):
1export https_proxy=http://127.0.0.1:6152;export http_proxy=http://127.0.0.1:6152;export all_proxy=socks5://127.0.0.1:6153
执行命令拉取依赖12345xcodebuild -resolvePackageDependencies -scmProvider system# 或者输入 projectxcodebuild -resolvePackageDependencies -scmProvider system -project YOURPROJECT.xc ...
编程语言
未读指针简介指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。在 C 语言中,指针有许多用法。本章将介绍如何把指针作为函数参数使用,以及为何要这样用。
假设一个指针变量名是ptr,可以编写如下语句:
1ptr = &pooh; // 把 pooh 的地址赋给 ptr
对于这条语句,我们说ptr“指向”pooh。ptr和&pooh的区别是ptr是变量,而&pooh是常量。或者,ptr是可修改的左值,而&pooh是右值。还可以把ptr指向别处:
1ptr = &bah; // 把 ptr 指向 bah,而不是 pooh
现在ptr的值是bah的地址。
要创建指针变量,先要声明指针变量的类型。假设想把ptr声明为储存int类型变量地址的指针,就要使用下面介绍的新运算符。
间接运算符:*假设已知ptr指向bah,如下所示:
1ptr = &bah;
然后使用间接运算符*(indirection operator)找出储存在 ...